栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

[思路分析二, 迭代法] [代码实现]
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/920761.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号