您的位置:首页 > Web前端 > Node.js

Remove Node in Binary Search Tree

2015-12-31 09:48 477 查看
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:

public class Solution {
/**
* @param root: The root of the binary search tree.
* @param value: Remove the node with given value.
* @return: The root of the binary search tree after removal.
*/
public TreeNode removeNode(TreeNode root, int value) {
if(root == null) {
return null;
}

if(root.val > value) {
root.left = removeNode(root.left, value);
}else if(root.val < value) {
root.right = removeNode(root.right, value);
}else {
// case 1: 叶子节点
if(root.left == null && root.right == null) {
root = null;
// case 2: 只有一个子树
}else if(root.left == null) {
root = root.right;
}else if(root.right == null) {
root = root.left;
// case 3: 有两个子树
}else {
TreeNode temp = findMin(root.right); //找到右子树种的最小值
root.val = temp.val;
root.right = removeNode(root.right, temp.val);
}
}
return root;
}

TreeNode findMin(TreeNode root) {
while(root.left != null) {
root = root.left;
}
return root;
}
}


[b]Complexity:[/b]

时间复杂度为O(n),n为树节点的个数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: