leetcode 练习(二叉树删除结点)

本文介绍了一种在二叉搜索树中删除指定节点的方法,确保树的特性不变。通过递归查找目标节点并调整其位置,实现了O(h)的时间复杂度。

Delete Node in a BST
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。

示例:

root = [5,3,6,2,4,null,7]
key = 3

5

/
3 6
/ \
2 4 7

给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。

一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。

5

/
4 6
/
2 7

另一个正确答案是 [5,2,6,null,4,null,7]。

5

/
2 6
\
4 7
之前的思路是找到那个点然后对那个点进行操作,后来发现我疏忽了一个点就是要改变这个结点不能单纯找到那个结点然后引用向别的结点,应该通过父节点的左右子树引用在递归中对返回值进行操作。

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
    	if(root==null)	return null;
    	if(root.val>key) {
    		root.left=deleteNode(root.left,key);	//对左子树操作
    	}
    	else if(root.val<key) {
    		root.right=deleteNode(root.right,key);
    	}
    	else {										//找到这个结点了
    		if(root.left==null) return root.right;	//root为叶子节点或者只有一个子树
    		if(root.right==null) return root.left;	//
    		TreeNode t=Find(root.right);			//找到对于这个结点的中序遍历顺序的下一结点
    		root.val=t.val;							//更改值
    		root.right=deleteNode(root.right,t.val);//删除原结点
    		
    	}
    	return root;
	}

	private TreeNode Find(TreeNode root) {
		while(root.left!=null) {		//中序遍历中最左边的在前面,然后是中,后。
			root=root.left;				//最近邻的结点也就是以root的中序遍历的第一个是最左边
		}
		return root;					
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值