13.<tag-二叉树和BST基础>lt.450. 删除二叉搜索树中的节点 dbc

13.<tag-二叉树和BST基础>lt.450. 删除二叉搜索树中的节点 dbc,第1张

lt.450. 删除二叉搜索树中的节点 [案例需求]

[思路分析一, 递归法]
  1. 不存在该节点, 遍历到了树的末尾. root == null;
    2. 存在该节点
    2.1 该节点的左子树, 右子树均为空, root置为null即可;
    2.2 该节点存在左子树, 直接root的直接左孩子节点代替root即可, 然后把这个节点删除
    2.3 该节点存在右子树, 直接root的直接右孩子节点代替root即可. 然后把这个节点删除
[代码实现]
class Solution {
	public int rightMin(TreeNode root) {//1.找到以某个结点为根节点的右子树最小值。
		root = root.right;
		while (root.left != null) root = root.left;//1.1循环往左找到最大值。
		return root.val;
	}

	public int leftMax(TreeNode root) {//2.找到以某个结点为根节点的左子树最大值。
		root = root.left;
		while (root.right != null) root = root.right;
		return root.val;
	}

    
        /**
            单层递归逻辑可能的五种情况
            1. 不存在该节点, 遍历到了树的末尾. root == null;
            2. 存在该节点
                2.1 该节点的左子树, 右子树均为空, root置为null即可;     
                2.2 该节点存在左子树, 直接root的直接左孩子节点代替root即可.
                2.3 该节点存在右子树, 直接root的直接右孩子节点代替root即可;
         */
	public TreeNode deleteNode(TreeNode root, int key) {
		if (root == null) {//3.递归终止条件
			return null;
		}
		if (key > root.val) {//4.如果查找的结点比根节点大,继续在右子树查找删除该结点
			root.right = deleteNode(root.right, key);
		} else if (key < root.val) {//5.如果查找的结点比根节点小,继续在左子树查找删除该结点
			root.left = deleteNode(root.left, key);
		} else {//6.如果找到了该结点,删除它
			if (root.left == null && root.right == null) {//7.以叶子节点为根节点的二叉搜索树只有一个元素,可以直接删除。
				root = null;
			} else if (root.right != null) {//8.如果有右子树,只要找到该右子树的最小值来替换,之后将它删除即可。
				root.val = rightMin(root);
				root.right = deleteNode(root.right, root.val);//9.将这个右子树的最小值替换根节点,此时存在两个相同节点,将这个节点删除即可。
			} else {//10.如果有左子树,只要找到该左子树的最大值来替换,之后将它删除即可。
				root.val = leftMax(root);
				root.left = deleteNode(root.left, root.val);//9.将这个左子树的最大值替换根节点,此时存在两个相同节点,将这个节点删除即可。
			}
		}
		return root;
	}
}

[思路分析二, 迭代法] [代码实现]

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1295612.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存