删除二叉搜索树的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
示例:
root = [5,3,6,2,4,null,7]
key = 3
给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。
解题思想
现在有一个二叉搜索树,现在要让你删除一个节点,并且保证整个BST的性质不变。
要保证整个性质,我们必须在删除的位置上,找一个合适的值来进行替换,使得BST上的每个节点都满足 当前节点的值大于左节点但是小于右节点
而替换策略就是:
1、当前删除位置,用左边子树的最大值的节点替换
2、或者是,用右边子树的最小值的节点替换
用上面的策略就可以保证删除后性质不变,并且调整开销也很少
1 class TreeNode { 2 int val; 3 TreeNode left; 4 TreeNode right; 5 TreeNode(int x) { val = x; } 6 } 7 8 public class Solution { 9 public int findReplacement(TreeNode parent,TreeNode node,boolean isLeft){ 10 if(node.right == null){ 11 if (isLeft) parent.left = node.left; 12 else parent.right = node.left; 13 return node.val; 14 } 15 return findReplacement(node,node.right,false); 16 } 17 18 public TreeNode deleteNode(TreeNode root, int key) { 19 if(root==null) return null; 20 if(root.val == key){ 21 if(root.left == null) 22 return root.right; 23 if(root.right == null) 24 return root.left; 25 root.val = findReplacement(root,root.left,true); // 选择左边最大的,或者右边最小的 26 } else{ 27 if(root.val > key) 28 root.left = deleteNode(root.left,key); 29 else root.right = deleteNode(root.right,key); 30 } 31 return root; 32 } 33 }
原文地址:https://www.cnblogs.com/kexinxin/p/10269842.html
时间: 2024-11-09 04:02:53