您的位置:首页 > 其它

删除二叉查找树的节点-LintCode

2015-08-30 16:47 281 查看




困难 删除二叉查找树的节点

给定一棵具有不同节点值的二叉查找树,删除树中与给定值相同的节点。如果树中没有相同值的节点,就不做任何处理。你应该保证处理之后的树仍是二叉查找树。

给出如下二叉查找树:
5
/ \
3 6
/ \
2 4
删除节点3之后,你可以返回:
5
/ \
2 6
\
4
或者:
5
/ \
4 6
/
2
本题看似简单,但是分的情况比较多,大多数二叉搜索树的删除代码看的云里雾里,自己写了个,可能有不足希望大家指点。
/**
* Definition of TreeNode:
* class TreeNode {
* public:
*     int val;
*     TreeNode *left, *right;
*     TreeNode(int val) {
*         this->val = val;
*         this->left = this->right = NULL;
*     }
* }
*/
class Solution {
public:
/**
* @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.
*/
TreeNode* removeNode(TreeNode* root, int value) {
// write your code here
if (!root)
return root;
TreeNode *cur = root, *par = NULL;
while (cur&&cur->val != value) {
par = cur;
if (cur->val > value)
cur = cur->left;
else if (cur->val < value)
cur = cur->right;
}
if (!cur)   //此时cur=NULL,表示没有找到val=value节点
return root; // do nothing
if (cur->left&&cur->right) { //找的的节点既有左孩子又有有孩子
TreeNode *son = cur->left, *sp = cur;
while (son->right) {
sp = son;
son = son->right;
} //son就是cur左子树种val最大的节点
cur->val = son->val; //把值赋值cur,这就完成了对cur操作
cur = son;
par = sp; //归根揭底,是要删除cur,但是cur赋值后,要删除左子树的最大点
}
TreeNode *dummy;
if(cur->right) // cur只右子树
dummy = cur->right;
else
dummy = cur->left;
if (cur == root) //cur就是根节点
root = dummy;
else {  //cur不是根节点,则par就为cur的父节点
if (par->left == cur)
par->left = dummy;
else
par->right = dummy;
}
delete cur;
return root;
}
};


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: