首页 > 代码库 > 非递归创建二叉树( 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++队列 )
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。