不熟悉树这个结构的可以看看数据结构:树这篇文章。
一棵二叉树是结点的一个有限集合,该集合:
像这样:
每个节点都有2个或1个或者0个子节点,这就是二叉树。而且
任意二叉树都是由以下几种情况构成的:
像这样除了最后一行,每一行的节点都有两个节点。
简单来讲完全二叉树就是最后一行的节点最少为1个,最多为2 ^ (n-1)个节点(n为此时的高度)并且从左到右要连续.而节点为2 ^ (n-1)时此时的完全二叉树就是满二叉树。
我们观察一下完全二叉树:
学过高中数学的应该能一眼看出来这是一个等比数列的前n项和结果就是:2^n - 1;但是这是完全二叉树也就是满二叉树最大的节点数,那最小的节点数是多少呢?这也不难算,最少节点个数就相当于最后一行只有1个节点,结果可以认为前(n-1)个节点的个数+1:
结果就是2 ^ (n-1) -1 + 1,也就是2 ^ (n-1).
再来计算一下如果这个数有i个节点,它的深度n是多少?既然刚才计算了总结点数 i = 2 ^ n - 1。那倒过来退n应该等于log(i + 1)这里是以2为底,但是我打出来那个2,所以就这样表示了。
最后还有一个比较重要的性质:对任何一棵二叉树, 如果度为0其叶结点个数为n0, 度为2的分支结点个数为n2,则有n0= n2+1.就是没有孩子的节点永远比有两个孩子节点的个数多一个。
当然这个二级结论可以推到出来的:
刚开始这里只有一个节点,他没有孩子所以没有孩子的节点为1个n0 = 1,有两个孩子节点的没有n2 = 0.
现在多加一个节点没有孩子的节点是1这个节点仍然只有1个n0 = 1,而有两个孩子的节点还是没有n2 = 0;
再添加一个节点发现终于有一个节点有两个孩子了,n2 = 1,但是呢此时没有孩子的节点是1,2这两个节点变成了2个,n0 = 2.仍然比n2多一个,后来的步骤都差不多,所以说n0用于比n2多1.
看几道简单的练习:
这里就要用到刚才推导出来的结论:
n0 = n2 + 1;
而叶子节点数就是度为0的节点,所以这题答案是199+1
因为二叉树中节点的度只有三种0,1,2也就是说
n0 + n1 + n2 = 2n,而现在我们求的是n0的个数:
n0 + n1 + n2 = 2n;
n0 + n0 - 1 + n1 = 2n;
2*n0 = 2n + 1 - n1;
而现在我们唯一不知道的就是n1的值,但是注意只有一个度的节点只有两种情况:
要么为1:
要么为0:
我们再看刚才得出的式子:
2*n0 = 2n + 1 - n1此时n1不可能为0,一旦为0了,那n0的个数就变成了n + 1/2,这显然是不合理的,所以只有一个度的节点个数只能是0,叶子节点个数自然而然就等于n了。
节点个数和数的高度的关系,之前也算出来了:
最大节点个数 = 2 ^ 高度 - 1.
最小节点个数 = 2 ^ (高度).
通过估算2的9次方是512,碰巧531是在2的9次方和10次方之间。所以这个树的高度是10.