题目:
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点; 如果找到了,删除它。
示例:
输入:root = [5,3,6,2,4,null,7], key = 3 输出:[5,4,6,2,null,null,7] 解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。 一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。 另一个正确答案是 [5,2,6,null,4,null,7]。
思路:
1.找到相应删除节点,删除它。
2.调整二叉树。
总共有五种情况:
(1)找不到删除节点,遍历到空节点,返回null
(2)左右孩子都为空,返回null
(3)左孩子为空右孩子不空,返回右孩子
(4)右孩子为空,左孩子不空,返回左孩子
(5)左右孩子都不为空,可以将左孩子放在右孩子的最左边左几代孙子上,也可以将右孩子放在左孩子的最右边的右孩子上。
class Solution { public TreeNode deleteNode(TreeNode root, int key) { //1.删除相应节点//2.调整二叉树 root = delete(root,key); return root; } private TreeNode delete(TreeNode root, int key) { //(1)没找到删除的节点,遍历到空节点直接返回 if (root == null) return null; if (root.val > key) { root.left = delete(root.left,key); } else if (root.val < key) { root.right = delete(root.right,key); } else { //(2)左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点 if(root.left==null&&root.right==null){ return null; } //(3)删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点 if (root.left == null) return root.right; //(4)删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点 if (root.right == null) return root.left; //(5)左右孩子节点都不为空,则将删除节点的左孩子放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点 TreeNode tmp = root.right; while (tmp.left != null) {//删除节点的右子树的最左面节点的左孩子 tmp = tmp.left; } tmp.left=root.left; return root.right; } return root; } }
标签:删除,450,root,力扣,key,孩子,null,树中,节点 From: https://www.cnblogs.com/cjhtxdy/p/17140492.html