Remove Node in Binary Search Tree

Question: 

Given a root of Binary Search Tree with unique value for each node.  Remove the node with given value. If there is no such a node with given value in the binary search tree, do nothing. You should keep the tree still a binary search tree after removal.

 

Example:

Given binary search tree:

          5

       /    \

    3          6

 /    \

2       4

Remove 3, you can either return:

          5

       /    \

    2          6

      \

         4

or :

          5

       /    \

    4          6

 /   

2

 

Analysis:

分三种情况考虑。

Case 1: 当目标节点是叶子节点,简单删去即可。

Case 2: 当目标节点只有左(右)子树,将目标节点的父节点和目标节点的左(右)子树相连。

Case 3: 当目标节点有左右子树,首先找到右子树中拥有最小值的节点(右子树中最靠左的子节点),然后将该最小值赋值给目标节点,最后删去这个拥有最小值的节点。

用递归可以清晰简洁地实现这个算法。

 

Code:

 1 public class Solution {
 2     /**
 3      * @param root: The root of the binary search tree.
 4      * @param value: Remove the node with given value.
 5      * @return: The root of the binary search tree after removal.
 6      */
 7     public TreeNode removeNode(TreeNode root, int value) {
 8         if(root == null) {
 9             return null;
10         }
11         
12         if(root.val > value) {
13             root.left = removeNode(root.left, value);
14         }else if(root.val < value) {
15             root.right = removeNode(root.right, value);
16         }else {
17             // case 1: 叶子节点
18             if(root.left == null && root.right == null) {
19                 root = null;
20             // case 2: 只有一个子树
21             }else if(root.left == null) {
22                 root = root.right;
23             }else if(root.right == null) {
24                 root = root.left;
25             // case 3: 有两个子树
26             }else {
27                 TreeNode temp = findMin(root.right); //找到右子树种的最小值
28                 root.val = temp.val;
29                 root.right = removeNode(root.right, temp.val);
30             }
31         }
32         return root;
33     }
34     
35     TreeNode findMin(TreeNode root) {
36         while(root.left != null) {
37             root = root.left;
38         }
39         return root;
40     }
41 }

 

 

Complexity:

时间复杂度为O(n),n为树节点的个数。

转载于:https://www.cnblogs.com/billzhou0223/p/5090759.html

以下是一个简单的二叉树实现的Java代码,包含了输出所有直径及其路径长度的方法: ```java public class BinaryTree<T> { private Node<T> root; // 构造函数 public BinaryTree(Node<T> root) { this.root = root; } // 节点类 private static class Node<T> { private T data; private Node<T> left; private Node<T> right; public Node(T data) { this.data = data; this.left = null; this.right = null; } } // 输出所有直径及其路径长度 public static <T> void diameterAll(BinaryTree<T> bitree) { if (bitree.root == null) { System.out.println("Binary tree is empty."); return; } List<List<Node<T>>> paths = new ArrayList<>(); List<Integer> diameters = new ArrayList<>(); findPaths(bitree.root, paths, new ArrayList<>()); calculateDiameters(bitree.root, paths, diameters); for (int i = 0; i < diameters.size(); i++) { System.out.println("Diameter: " + diameters.get(i) + ", Path: "); for (Node<T> node : paths.get(i)) { System.out.print(node.data + " "); } System.out.println(); } } // 查找所有路径 private static <T> void findPaths(Node<T> node, List<List<Node<T>>> paths, List<Node<T>> path) { if (node == null) { return; } path.add(node); if (node.left == null && node.right == null) { paths.add(new ArrayList<>(path)); } else { findPaths(node.left, paths, path); findPaths(node.right, paths, path); } path.remove(path.size() - 1); } // 计算直径 private static <T> int calculateDiameters(Node<T> node, List<List<Node<T>>> paths, List<Integer> diameters) { if (node == null) { return 0; } int leftHeight = calculateDiameters(node.left, paths, diameters); int rightHeight = calculateDiameters(node.right, paths, diameters); int diameter = leftHeight + rightHeight; diameters.add(diameter); return Math.max(leftHeight, rightHeight) + 1; } public static void main(String[] args) { // 创建二叉树示例 Node<Integer> node1 = new Node<>(1); Node<Integer> node2 = new Node<>(2); Node<Integer> node3 = new Node<>(3); Node<Integer> node4 = new Node<>(4); Node<Integer> node5 = new Node<>(5); node1.left = node2; node1.right = node3; node2.left = node4; node3.right = node5; BinaryTree<Integer> bitree = new BinaryTree<>(node1); // 输出所有直径及其路径长度 diameterAll(bitree); } } ``` 这段代码使用了二叉树的先序遍历来查找所有路径,然后计算每个路径的直径。最后,输出每个直径及其路径长度。以上是一个简单的实现,你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值