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

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;
	}
}

[思路分析二, 迭代法]

[代码实现]


posted @   青松城  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示