快速判断BST节点大小

遇到AVL树或者红黑树做调整的时候,如果能够快速判断出节点的大小,无疑是十分有利的。

鄙人想了一个方法是:

1.最左侧的节点总是最小的,最右侧的节点总是最大的。

2.判断出一个最大或者最小以后,将这个点删掉,它的子节点代替它的位置。

3.重复1直到所有的节点都判断完成。

注意如果子树水平方向画的时候不要超过根,就是左子树画在根的左侧,右子树画在根的右侧。

看一个例子:

在这里插入图片描述
可以得到最小的是D
在这里插入图片描述
可以得到D<B,再将B删掉以后把E接上去
在这里插入图片描述
依次可以得到:D<B<H<E<A<F<C<G<I(这个肉眼都能看出来)

原来的树是这样的:A7,B2,C11,D1,E5,F8,G14,H4,I15
在这里插入图片描述
更不用说只有三个点了:

在这里插入图片描述
B<C<A

在这里插入图片描述
A<C<B(像A和C好像看不出谁左边,其实C不能超过A,右子树不能超过根,到左边来)

证明

1.对于每一个节点来说,左子树<根<右子树,因此最左边的肯定是最小的。

2.被替换的唯一可能性是被删除的点的左子树为NULL,因此无论拿右边的什么点来代替根都是可以的,那么就拿和它相邻的这个了。

3.相当于每次都找一个最小的,和选择排序差不多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值