设计算法求以孩子兄弟链表为存储结构的树的深度
基于层次遍历的非递归算法,逐层遍历树,取得树的高度。
队列的基本操作以严蔚敏编写的教材为准。
如有谬误或者不足还请批评指正!
int GetDepth(CSTree bt)
{
InitQueue(Q); //初始化队列
CSNode *p = bt; //p为遍历指针
EnQueue(Q, p); //根节点入队
int depth = 0; //深度初始化为0
while (!QueueEmpty(Q)) //队列不空则循环
{
//每次while循环时队列里的元素就是某一层的所有结点
//使用for循环来遍历每一层的结点,QueueLength(Q)求队列的长度,即当前层结点数
int length = QueueLength(Q);
for (int i = 0; i < length; i++)
{
DeQueue(Q, p); //队头结点出队
//如果指向结点第一个孩子结点的指针*firstchild不为空
if (p->firstchild != NULL)
{
//结点的第一个孩子入队
p = p->firstchild;
EnQueue(Q, p);
//这个while循环将第一个孩子结点的所有兄弟结点全部入队
while (p->nextsibling != NULL)
{
p = p->nextsibling;
EnQueue(Q, p);
}
}
}
depth++;
}
return depth;
}
为了方便理解,举个例子:

用孩子兄弟表示法表示这棵树(“^”表示空):

开始执行算法求深度:
-
根节点R入队,depth=0;
此时队列中的元素为:
R -
队列不空,则第一轮while循环;
队列长度为1,for循环执行1次;(1)队头结点R出队,R的第一个孩子不为空, A入队; A的右兄弟不为空,B入队,B的右兄弟不空,C入队,C的右兄弟为空;depth=1;
此时队列中的元素为:
A B C -
队列不空,则第二轮while循环;
队列长度为3,for循环执行3次;(1)队头结点A出队,A的第一个孩子不为空,D入队; D的右兄弟不为空,E入队,E的右兄弟为空; (2)队头结点B出队,B的第一个孩子为空; (3)队头结点C出队,C的第一个孩子不为空,F入队; F的右兄弟为空;depth=2;
此时队列中的元素为:
D E F -
队列不空,则第三轮while循环;
队列长度为3,for循环执行3次;(1)队头结点D出队,D的第一个孩子为空; (2)队头结点E出队,E的第一个孩子为空; (3)队头结点F出队,F的第一个孩子不为空,G入队; G的右兄弟不为空,H入队,H的右兄弟不为空,K入队,K的右兄弟为空;depth=3;
此时队列中的元素为:
G H K -
队列不为空,则第四轮while循环;
队列长度为3,for循环执行3次;(1)队头结点G出队,G的第一个孩子为空; (2)队头结点H出队,H的第一个孩子为空; (3)队头结点K出队,K的第一个孩子为空;depth=4;
此时队列为空,结束while循环,返回树的深度depth=4;
本文介绍了如何设计一个基于层次遍历的非递归算法来计算以孩子兄弟链表为存储结构的树的深度。通过逐层遍历,利用队列进行操作,逐步增加深度值,最终得到树的高度。文中通过实例详细解释了算法的执行过程。

2万+

被折叠的 条评论
为什么被折叠?



