算法笔记:平衡二叉树(AVL)最小结点数与斐波那契数列的关系

写点思考性质的文字,最好还是不要太突兀,背景前提什么的还是需要有的……

平衡二叉树是什么?

我自己的理解:
二叉树里面的完全二叉树就是一种很平衡的树,即按照1-23-4567-89101112131415-……这么一行行分叉下去的数。所以在二叉树的定义里,就有了这样的描述:
一个空树(根本没有结点的);或者任意结点,它的左右子树的高度差不大于1(我觉得这里用完全二叉树来辅助记忆挺不错)。

但是要注意一点;
只要满足任意一个结点的左右两子树的高度不大于1就可以是平衡二叉树。而刚才说的完全二叉树,是满足这一条件的“最完全”状态,所以自然也就存在去掉中间某些结点后还是平衡二叉树的“不完全”状态。

由此引出平衡二叉树最小结点数的问题。

如何来理解最小结点数?

开始前的说明

关于高度,初学者容易和深度混淆,深度是从根结点开始的,而高度是从任意结点到叶子结点的。所以这里所说的左右子树的高度差可以这么来理解:

一个结点没有子树了,那么高度就是0(0 - 0 = 0),有一个子结点就为1(1 - 0 = 0)

这样再来理解左右子树的高度差,
假设一棵树有3层,那么把第一层作为一个结点,第二第三层的结点构成这个结点的左右子树,这个3层数的高度也就是2(0、1、2),那么第一层结点的左右子树的高度也就为1,1或者0,1。

用字母表示,这棵树的高度h,第一层结点的左右子树的高度,在结点数最少时,要满足一个是h - 1、另一个是h - 2;用nh来表示对应h的结点数,那么这里:n(h-1) = 1, n(h-2) = 0, n(h) = 1 + 0 + 1 = 2。

推广出这个公式:n(h) = n(h-1) + n(h-2) + 1,这个1是两棵左右子树所上接的结点。

与斐波那契数列什么关系呢?

斐波那契数列的第1、第2项都为1,然后后面的每一项都是前两项之和;
而平衡二叉树的最小结点数,第1项为1,第2项(h = 1)为2,且后面的每一项是前两项之和再加1。具体写一下:

Fh 1 1 2 3 5 8 13 21 34
nh 1 2 4 7 12 20 33

可以观察到nh = F(h+2) - 1然后再往下多分析一步:
找出两者之间的关系,其实就是为了大致计算出h与n的关系。
Fh的近似值:0.4472135955 * 1.618033988745^h
所以,最终想要得到的近似关系是,两边同取lg,计算出h与n的关系。

最后一点

其实这样的计算是很不严谨的,因为偏差还是很大的。不过能够理解最小结点数是怎么来的(怎么递推出来的),倒是一种很好的思维逻辑锻炼。

PS. 最小结点数和对应的高度意味着,比如h = 4,那么结点数12~19范围内都是h = 4的树。

猜你喜欢

转载自www.cnblogs.com/ZealYoung/p/10845076.html
今日推荐