非递归创建二叉树( C++队列 )

 非递归按照 层序 创建二叉树,利用 队列(即可先进先出特点)存放已访问的结点元素的地址。

 初始化:front=rear= -1;

 每储存一个结点元素 rear+1 ,利用 rear%2==0 来使 front+1 回车表示结点输入完毕

 

 1 //     结构体
 2 struct Node {
 3     char data;
 4     Node * lchild;
 5     Node * rchild;
 6 };
 7 /*     类 class Tree中的私有构造方法 Node * Create()
 8      注:该方法需要 以层序遍历的方式输入
 9 */
10 Node * Tree::Create() {
11     Node * Queue[max];    // max为最大的存放结点数据个数
12     char ch[max];
13     int front = -1, rear = -1, i = 0;
14     Node * root = NULL, * tem = NULL;
15     
16     cin>> ch;    // 输入结点数据
17     while(ch[i] != '\0') {    
18         // 对输入的字符进行检查是 空还是值,并将其放入队列中
19         if(ch[i] != '#') {        // 不等于空,是元素,创建结点并保存数据,将其 tem地址 放入队列中
20             tem = new Node();
21             tem->data = ch[i];
22             Queue[++rear] = tem;
23         } else {                // 输入的为空,将一个 NULL 同样放入队列中去
24             tem = NULL;
25             Queue[++rear] = tem;
26         }
27         // 设置结点的左右孩子
28         if(rear == 0) {     // 如果 rear为0,表示是第一个元素,即根结点 有且只有一次执行内部语句
29             root = tem; //此时的root指向 tem,而Queue[0]也是指向tem的地址,故 root 间接指向了 Queue[0],以下代码构建左右孩子树时,Queue[0]为根结点,即构建以当前 第一个创建的 tem地址为根结点的二叉树,所以 root指向了tem(注意:这行代码只执行一次)
30         } else {
31             if(Queue[front+1]!=NULL && tem!=NULL) { //不为根结点 front+1指向的是队头,所以判断 队头不空并且tem不空,即含有左右还有(因为空的话,则无孩子)
32             // 因为按照队列存储方式,除根结点以外,下标为奇数的都是左孩子,偶数的都是右孩子
33                 if(rear%2 == 1) {      // 奇:左孩子
34                     Queue[front+1]->lchild = tem;
35                 } else {            // 偶:右孩子
36                     Queue[front+1]->rchild = tem;    //注意:执行本语句时,表示将当前的 tem结点已经作为某个结点的右孩子
37                     front++;    //    front++,表示当前队头的右孩子都设置好了,说明队头元素左右孩子都弄完了,就该下一个结点设置左右孩子了,那么就让当前队头出队,将下一个结点设为队头
38                 }
39             }
40         }
41         i++;    // 字符数组下标增 1,设置下一个字符元素
42     }
43     return root;
44 }

 

 

 

  该图为 第一次执行到 构建右孩子时的示意图:

 

转载于:https://www.cnblogs.com/log-xian/p/6033709.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值