450. Delete Node in a BST
来源:互联网 发布:下载人聊天软件 编辑:程序博客网 时间:2024/05/22 10:58
Given a root node reference of a BST and a key, delete the node with the given key in the BST. Return the root node reference (possibly updated) of the BST.
Basically, the deletion can be divided into two stages:
- Search for a node to remove.
- If the node is found, delete the node.
Note: Time complexity should be O(height of tree).
Example:
root = [5,3,6,2,4,null,7]key = 3 5 / \ 3 6 / \ \2 4 7Given key to delete is 3. So we find the node with value 3 and delete it.One valid answer is [5,4,6,2,null,null,7], shown in the following BST. 5 / \ 4 6 / \2 7Another valid answer is [5,2,6,null,4,null,7]. 5 / \ 2 6 \ \ 4 7
我们先来看一种递归的解法,首先判断根节点是否为空。由于BST的左<根<右的性质,使得我们可以快速定位到要删除的节点,我们对于当前节点值不等于key的情况,根据大小关系对其左右子节点分别调用递归函数。若当前节点就是要删除的节点,我们首先判断是否有一个子节点不存在,那么我们就将root指向另一个节点,如果左右子节点都不存在,那么root就赋值为空了,也正确。难点就在于处理左右子节点都存在的情况,我们需要在右子树找到最小值,即右子树中最左下方的节点,然后将该最小值赋值给root,然后再在右子树中调用递归函数来删除这个值最小的节点,参见代码如下:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Solution { public TreeNode deleteNode(TreeNode root, int key) { if(root == null){ return root; }else if(key<root.val){ root.left = deleteNode(root.left, key); //要删除的点在左边,返回左节点 }else if(key>root.val){ root.right = deleteNode(root.right, key); }else{ if(root.left!=null && root.right != null){ root.val = findMin(root.right).val; root.right = deleteNode(root.right, root.val); //要记得删除移上来的那一点 }else{ if(root.left==null) root=root.right; else root=root.left; } } return root; } public TreeNode findMin(TreeNode root){ while(root.left != null){ root = root.left; } return root; }}
阅读全文
0 0
- [hard]450. Delete Node in a BST
- 450. Delete Node in a BST
- LeetCode 450. Delete Node in a BST
- 450. Delete Node in a BST
- LeetCode 450. Delete Node in a BST
- Leetcode-450. Delete Node in a BST
- 450. Delete Node in a BST
- 【LeetCode】 450. Delete Node in a BST
- [LeetCode]450. Delete Node in a BST
- 450. Delete Node in a BST
- 450. Delete Node in a BST**
- 450. Delete Node in a BST
- 450. Delete Node in a BST
- LeetCode 450. Delete Node in a BST
- LeetCode 450.Delete Node in a BST
- 450. Delete Node in a BST
- leetcode 450. Delete Node in a BST
- 450. Delete Node in a BST
- 【VBA】单元格合并思路
- 为什么要配置环境变量?
- Ubuntu 16.04/14.04安装SS与Chrome
- 人机大战第三局,柯洁中盘认输意义何在?
- 【VBA】动态数组
- 450. Delete Node in a BST
- Android自定义一个ActivityManager管理类笔记
- 【VBA】遍历文件夹及子文件夹
- 写内容到Windows的文件怎么换行?
- bzoj3620 似乎在梦中见过的样子 kmp
- 柯洁仍然是中国围棋冠军,向科学认输、底头不是耻辱!
- 搜索二叉树和平衡二叉树
- 博客Markdown语法
- Android基础篇(一)屏幕,文本,图形,控件