设计算法求以孩子兄弟链表为存储结构的树的深度

本文介绍了如何设计一个基于层次遍历的非递归算法来计算以孩子兄弟链表为存储结构的树的深度。通过逐层遍历,利用队列进行操作,逐步增加深度值,最终得到树的高度。文中通过实例详细解释了算法的执行过程。

设计算法求以孩子兄弟链表为存储结构的树的深度

基于层次遍历的非递归算法,逐层遍历树,取得树的高度。

队列的基本操作以严蔚敏编写的教材为准。

如有谬误或者不足还请批评指正!

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;
}

为了方便理解,举个例子:
一棵普通的树
用孩子兄弟表示法表示这棵树(“^”表示空):
在这里插入图片描述
开始执行算法求深度:

  1. 根节点R入队,depth=0;
    此时队列中的元素为:
    R

  2. 队列不空,则第一轮while循环;
    队列长度为1,for循环执行1次;

    (1)队头结点R出队,R的第一个孩子不为空, A入队;
     	A的右兄弟不为空,B入队,B的右兄弟不空,C入队,C的右兄弟为空;
    

    depth=1;
    此时队列中的元素为:
    A B C

  3. 队列不空,则第二轮while循环;
    队列长度为3,for循环执行3次;

    (1)队头结点A出队,A的第一个孩子不为空,D入队;
    	D的右兄弟不为空,E入队,E的右兄弟为空;
    
    (2)队头结点B出队,B的第一个孩子为空;
    
    (3)队头结点C出队,C的第一个孩子不为空,F入队;
    	F的右兄弟为空;
    

    depth=2;
    此时队列中的元素为:
    D E F

  4. 队列不空,则第三轮while循环;
    队列长度为3,for循环执行3次;

    (1)队头结点D出队,D的第一个孩子为空;
    
    (2)队头结点E出队,E的第一个孩子为空;
    
    (3)队头结点F出队,F的第一个孩子不为空,G入队;
    G的右兄弟不为空,H入队,H的右兄弟不为空,K入队,K的右兄弟为空;
    

    depth=3;
    此时队列中的元素为:
    G H K

  5. 队列不为空,则第四轮while循环;
    队列长度为3,for循环执行3次;

    (1)队头结点G出队,G的第一个孩子为空;
    
    (2)队头结点H出队,H的第一个孩子为空;
    
    (3)队头结点K出队,K的第一个孩子为空;
    

    depth=4;
    此时队列为空,结束while循环,返回树的深度depth=4;

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值