删除二叉查找树的节点-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; } };
相关文章推荐
- 主席树模板
- JAVA变量在内存中的分配
- 用virtualenv管理python3运行环境
- global.asax文件的应用
- 《Unicode之痛》摘抄
- Xcode 注释插件
- C++内存管理
- jquery实现整屏翻屏效果:jquery.mousewheel(一)
- Win8下双系统win7 教程详解
- 【java】Random函数
- .msi是什么文件
- KMP优化
- list-style-position的inside 与outside的区别
- 异步FIFO Verilog代码注释分析
- ORA-00600: internal error code, arguments: [keltnfy-ldmInit], [46], [1], [], [], [], [], []
- 黑马程序员_集合框架(四)
- Bash的条件表达式求值
- 运维Nginx-----nginx的学习之路
- Linux程序包管理学习
- 常见问题