450. Delete Node in a BST

本文详细介绍了如何在二叉搜索树中删除指定值的节点,包括三种情况:删除叶子节点、删除有一个子节点的节点和删除有两个子节点的节点。通过递归调用和寻找后继节点或前驱节点来保持树的性质。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public TreeNode deleteNode(TreeNode root, int key) {
	if (root == null) return null;

	if      (key < root.val) root.left  = deleteNode(root.left, key);
	else if (key > root.val) root.right = deleteNode(root.right, key);
	else {
		if 		(root.left  == null) return root.right;
		else if (root.right == null) return root.left;

		// TreeNode minNode = sucessor(root);
		root.val = successorVal(root);
		root.right = deleteNode(root.right, root.val);
	}
	return root;
}

public int successorVal(TreeNode root) {
	root = root.right;
	while (root.left != null) 
		root = root.left;
	return root.val;
}


public int successor(TreeNode root) {
	root = root.right;
	while (root.left != null) 
		root = root.left;
	return root.val;
}

public int predecessor(TreeNode root) {
	root = root.left;
	while (root.right != null)
		root = root.right;
	return root.val;
}

public TreeNode deleteNode(TreeNode root, int key) {
	if (root == null) return null;
	
	if      (key > root.val) root.right = deleteNode(root.right, key);
	else if (key < root.val) root.left  = deleteNode(root.left, key);
	else {
		if (root.left == null && root.right == null) root = null;
		else if (root.right != null) {
			root.val = successor(root);
			root.right = deleteNode(root.right, root.val);
		} else {
			root.val = predecessor(root);
			root.left = deleteNode(root.left, root.val);
		}
	}
	return root;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值