Remove Node in Binary Search Tree
来源:互联网 发布:霹雳知乎 编辑:程序博客网 时间:2024/06/05 08:28
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.
设找到的需要删除的节点为node
- 如果node是根节点,删除根节点;
- 如果node的右子树为空,直接将node的左子树赋给node的parent节点;
- 如果node的右子树不为空,则需要找一个node的后继(即在右子树中找一个值最小的节点)替换node;
- 如果找不到node则返回root;
技巧:
因为要删除的节点可能是根节点,因此为了算法的通用性,可以首先new一个dummy节点,该节点的左节点指向根节点,这样处理起来更为方便。
/** * 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* dummy =new TreeNode(0); dummy->left=root; TreeNode* parent=findNode(dummy,root,value); TreeNode* node; if(parent->left && parent->left->val==value){ node=parent->left; }else if(parent->right && parent->right->val==value){ node=parent->right; }else{ return dummy->left;//没有找到的情况 } deleteNode(parent,node); return dummy->left; } TreeNode* findNode(TreeNode* parent,TreeNode* node,int val){ if(node==NULL){ return parent; } if(node->val==val){ return parent; } if(node->val<val){ return findNode(node,node->right,val); }else{ return findNode(node,node->left,val); } } void deleteNode(TreeNode* parent,TreeNode* node){ if(node->right==NULL){ if(parent->left==node){ parent->left=node->left; }else{ parent->right=node->left; } }else{ TreeNode* father=node; TreeNode* minNode=node->right; while(minNode->left){ father=minNode; minNode=minNode->left; } //这里容易出错 if(father->left==minNode){ father->left=minNode->right; }else{ father->right=minNode->right; } if(parent->left==node){ parent->left=minNode; }else{ parent->right=minNode; } minNode->left=node->left; minNode->right=node->right; } }};
0 0
- Remove Node in Binary Search Tree
- Lintcode - Remove Node in Binary Search Tree
- [刷题]Remove Node in Binary Search Tree
- lintcode:Remove Node in Binary Search Tree
- Remove Node in Binary Search Tree
- Insert Node in a Binary Search Tree
- Insert Node in a Binary Search Tree
- Lintcode87 Remove Node In Binary Search Treesolution 题解
- Lintcode87 Remove Node In Binary Search Treesolution 题解
- [刷题]Insert Node in a Binary Search Tree
- lintcode: Insert Node in a Binary Search Tree
- #85 Insert Node in a Binary Search Tree
- Lintcode85 Insert Node In A Binary Search Tree solution 题解
- binary search tree in C++
- Search Range in Binary Search Tree
- [刷题]Search Range in Binary Search Tree
- lintcode:Search Range in Binary Search Tree
- Search Range in Binary Search Tree
- AndroidStudio R.java文件丢失的问题
- 屏幕参数
- kmp算法字符串匹配C语言实现
- 单链表-----数据结构
- 求两个数的最大公约数
- Remove Node in Binary Search Tree
- 黑马程序员——JAVA学习日志之异常
- Leetcode 110. Balanced Binary Tree
- mysql创建用户和授权的三种方式
- tomcat、servlet学习
- 【spark source】Spark LinearRegression源码解读
- android view 动画学习
- C/C++程序题(21-25)
- 求四个数的最大公约数