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:
[b]Complexity:[/b]
时间复杂度为O(n),n为树节点的个数。
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为树节点的个数。
相关文章推荐
- Delete Node in a Linked List
- nodejs跨域服务端配置
- Reverse Nodes in k-Group
- [LeetCode] 237. Delete Node in a Linked List 解题思路
- LeetCode 117:Populating Next Right Pointers in Each Node II
- LeetCode 116:Populating Next Right Pointers in Each Node
- nodejs的某些api~(四)udp&dns
- HBase 常见错误-ERROR: Can't get master address from ZooKeeper; znode data == null解决办法
- 编译nodejs及其源代码研究
- 对nodejs express 框架的简单封装实现快速开发
- Node Inspector 调试 Node.js 程序
- namenode ha
- <LeetCode OJ>Delete Node in a Linked List【237】
- NodeJs 环境搭建
- node安装和基础
- 构建垂直搜索引擎 本课程带领大家实现一个简单的垂直搜索引擎网站,使用nodejs、python、elasticsearch实现的。
- windows下node.js及express的安装
- nodejs 学习笔记-基础
- 如何使用npm发布Node.JS程序包
- [LeetCode]Populating Next Right Pointers in Each Node II