利用队列遍历用儿子/兄弟链存储的树

本文详细阐述了一种非递归遍历树形结构的方法,利用队列实现深度优先搜索,通过实例和代码展示了遍历过程,旨在帮助读者理解并掌握非递归遍历技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

    一棵树的节点定义格式如下:
 struct Node{
    Node* parent;

    Node* firstChild; // 孩子节点

    Node* sibling; // 兄弟节点 
}

    要求非递归遍历该树。

解题思路:

    使用队列存储遍历的思想:

  1. 根结点设为哨兵点。
  2. 哨兵节点的所有儿子节点依据左到右的顺序推入队列中,然后弹出队列头的节点,做为哨兵结点。
  3. 判断哨兵结点是或为空节点,如果为空,说明队列已经空了遍历结束,否则进行步骤2

    一个用儿子/兄弟链存储的树形结构如图1所示首先把根结点1的儿子2、3推入队列中,弹出2。把结点2的儿子4、5、6推入队列,弹出3。把节点3的儿子7、8推入队列,弹出4。此时哨兵4无儿子,弹出5依次弹出8,队列为空了,结束遍历。表1反应了遍历图1所有节点过程

 

                         图1儿子/兄弟链表


                                  表1链表的遍历过程
                      

哨兵

推入结点

弹出结点

队列元素变化

1

2、3

2

{}->{2、3}->{3}

2

4、5、6

3

{3}->{3、4、5、6}->{4、5、6}

3

7、8

4

{4、5、6}->{4、5、6、7、8}->{5、6、7、8}

4

5

{5、6、7、8}->{5、6、7、8}->{6、7、8}

5

6

{6、7、8}->{6、7、8}->{7、8}

6

7

{7、8}->{7、8}->{8}

7

8

{8}->{8}->{}                                           


代码实现:

queue<Node*> nodeQueue;//队列对象
void print(Node * );//打印该结点
void printAll(Node * root)
{
      Node* temp = root;//初始哨兵为根
      while(temp)//结点
      {
            print(temp);
            temp = temp->firstChild;
            while(temp)//哨兵儿子推入队列中
            {
                 nodeQueue.push(temp);
                 temp = temp->sibling;
            }
             temp = nodeQueue.pop();//重新
      }//设置哨兵
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值