遇到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.相当于每次都找一个最小的,和选择排序差不多。