首页 > 代码库 > 非递归创建二叉树( C++队列 )

非递归创建二叉树( 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 =http://www.mamicode.com/ 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 }

 

 

 

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

技术分享

 

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