创建于:2019.5.23 - 5.25
个人思考过程,不是普遍运用的简便方法。
判断二叉树(不限于完全二叉树)一个结点的层数:
BinaryNode<T> p;
完全二叉树可以根据公式算出结点p的层数
假如结点p是第i个结点(i>=0),根据完全二叉树的性质h=(log2 i)+1可算出层数
假如要计算普通二叉树一个结点的层数,则没有公式,想算法:
- 思考:
- 利用层数遍历的得到的list
结果:只能得出每个结点的序号,无法判断其层数
- (行不通)方一:利用标明空子树的前序序列preList
定义一个int型 层数数组
逐个元素(包括空标识)往后遍历,每遍历一个层次+1,当上一个是空标识时,该元素层值,上两个是空标识时,层值 -1,上三个是空标识时,层值 -3
(可行)例一:
prelist= (A B D ^ G ^ ^ ^ C E ^ ^ F ^ ^)
level[]= 1 2 3 4 4 5 5 5 2 3 4 4 3 4 4
(不可行)例二:
Prelist= ( A B E ^ F ^ ^ C ^ D G ^ ^ ^ ^ )
Level[]= (1, 2 , 3, 4, 4 , 5, 5, 4, 5, 5, 6, 7 , 7, 7 ,4 )
3
- (已改进)方法二:利用 标明空子树标识的前序序列preList和层次遍历得到的levelList
*泛型用ArrayList代替数组
定义一个数组存放层次序号,长度为二叉树结点个数
主要遍历leveList,过程见例一
(可行)例一:
prelist= ( A B D ^ G ^^^C E ^^ F ^^)
levelList= (A B C D E F G )
level[]= 1 2 2 3 3 3 4
过程:
根结点只有一个,所以第一个A的层数肯定是1
第二个B的层数肯定是2;
LevelList下标指向C,preList下标指向D,若不相等,层数不变,且preList下标不变;
*为什么:
levelist中B的下一个是C,要么C是B的孩子,要么C是B的兄弟。在preList中,B的下一个元素不是C(C不是B的孩子),所以C肯定是B的兄弟
LevelList下标指向D,preList的下标仍是D,相等,层数+1(D的层数为3),preList下标+1(指向G)
*为什么:D在C的后面,D可能是B的孩子也可能是C的孩子,但是谁的孩子不重要,肯定不是兄弟(因为是二叉树),层数+1
(可行)例二:
Prelist= ( A B E ^ F ^^ C ^ D G ^ ^^ ^)
levelList= (A B E C F D G )
level[]= ( 1, 2, 3, 3, 4, 4, 4 )
(改进后可行)例三:
Prelist= ( 100 , 40 , 19, ^^, 21,^^, 60, 28, 11, 5 , 2 ,^^, 3,^^,6, 17, 7,^^,10,^^,32,^^)
levelList= (100, 40, 60, 19, 21, 28, 32, 11, 17 , 5, 6, 7, 10, 2, 3 )
level[]= ( 1, 2, 2, 3, 4, 4, 4, 4 , 4, 4, 4, 4, 4, 4, 4 )
3 3 3 4 4 5 5 5 5 6 6