下午只是大概想了一下可以程序化的思路,大概就是:
1. 这是对一棵满二叉树的 宽度优先遍历 与 深度优先遍历 的结合
2. 并且不能随便做宽度遍历,必须保证当前这一层中的某个结点的父结点已被选中,才能在此层选中这个结点
感觉过程实现起来还是挺复杂的,先不写代码为难自己了。
暂时先有个模糊的思路,以后等着积累多了,形成更清晰的思路,再呈现代码吧。
那么,知道了树与二叉树的区别,能继续说出3个结点的树有几种形态么?
已知3结点的二叉树的5种形态是:
橘 ——绿 + 红(1种)
——绿 + 蓝/黄(2种)
——红 + 紫/灰(2种)
而树不分左孩子和右孩子,所以3结点的树有3种形态,具体是:
橘 ——绿 + 红(1种)
——绿 + 蓝/黄(1种)
——红 + 紫/灰(1种)
二叉树的性质
1. 二叉树的
第1层最多有1个结点——树的根
第2层最多有1*2=2^1个结点
第3层最多有(1*2)*2=2^2个结点
......
同理可知,第n层最多有2^(n-1)个结点
最多的含义:每个结点如果有孩子,同时有左孩子和右孩子
2. 深度为k的二叉树,如果每一层均有最多的结点,那么这棵二叉树最多有结点数
1+(2^1)+(2^2)+......+(2^(k-1))=1*(1-2^k)/(1-2)=2^k-1
备注:
等比(公比:q)数列(一共n项)的求和公式:首项*(1-q^n)/(1-q)
3. 叶子结点(度为0的结点)的数目=度为2的结点的个数+1(3)
证明:
下面要构建一个等式,这个等式的依据是:
二叉树的结点总数=树的根个数+非树根结点的个数(1)
树的根只有1个,所以树的根的个数=1
非树根的结点均有一个直接前驱,所以非树根结点的个数=二叉树的分支数
二叉树的分支数+1=结点的数目(2)
上面是由(1)得到(2)的过程,下面讲述由(2)得到(3)的过程
设
n0——度为0的结点(叶子结点)个数,构成总分支数0*n0=0
n1——度为1的结点个数,构成总分支数1*n1=n1
n2——度为2的结点个数,构成总分支数2*n2=2n2
所以(2)改写成:
0+n1+2n2 + 1 = n0+n1+n2
n2+1 = n0(3)
证明结束。
九层之台,起于累土;千里之行,始于足下。基础的重要性是怎么强调都不为过的,但是真正重视的没有几人。
厚积才能薄发......,你懂的。所以我承认现在的自己不厉害,但是我尽力学的透彻一点,明白一点,终归是有 好处的。
满二叉树
满的含义就是每一层都装满了结点,其实就是前面提到的最多的含义:每层结点都做到最多
所以
满二叉树的第n层结点的结点个数是2^(n-1);
满二叉树(k层)的结点总数是2^k-1。
完全二叉树
完全二叉树就是除了最后一层可以不装满结点,其余层均装满结点的二叉树
所以k层完全二叉树的前k-1层构成的树是一个满二叉树
先整理到这里,因为已经23:41了,不能因为赶进度而影响不紧急的要事的进度,
下次接着讲完全二叉树的性质,晚安!