非递归创建二叉树( C++队列 )
非递归按照 层序 创建二叉树,利用 队列(即可先进先出特点)存放已访问的结点元素的地址。
初始化:front=rear= -1;
每储存一个结点元素 rear+1 ,利用 rear%2==0 来使 front+1 回车表示结点输入完毕
// 结构体
struct Node {
char data;
Node * lchild;
Node * rchild;
};
/* 类 class Tree中的私有构造方法 Node * Create()
注:该方法需要 以层序遍历的方式输入
*/
Node * Tree::Create() {
Node * Queue[max]; // max为最大的存放结点数据个数
char ch[max];
int front = -, rear = -, i = ;
Node * root = NULL, * tem = NULL; cin>> ch; // 输入结点数据
while(ch[i] != '\0') {
// 对输入的字符进行检查是 空还是值,并将其放入队列中
if(ch[i] != '#') { // 不等于空,是元素,创建结点并保存数据,将其 tem地址 放入队列中
tem = new Node();
tem->data = ch[i];
Queue[++rear] = tem;
} else { // 输入的为空,将一个 NULL 同样放入队列中去
tem = NULL;
Queue[++rear] = tem;
}
// 设置结点的左右孩子
if(rear == ) { // 如果 rear为0,表示是第一个元素,即根结点 有且只有一次执行内部语句
root = tem; //此时的root指向 tem,而Queue[0]也是指向tem的地址,故 root 间接指向了 Queue[0],以下代码构建左右孩子树时,Queue[0]为根结点,即构建以当前 第一个创建的 tem地址为根结点的二叉树,所以 root指向了tem(注意:这行代码只执行一次)
} else {
if(Queue[front+]!=NULL && tem!=NULL) { //不为根结点 front+1指向的是队头,所以判断 队头不空并且tem不空,即含有左右还有(因为空的话,则无孩子)
// 因为按照队列存储方式,除根结点以外,下标为奇数的都是左孩子,偶数的都是右孩子
if(rear% == ) { // 奇:左孩子
Queue[front+]->lchild = tem;
} else { // 偶:右孩子
Queue[front+]->rchild = tem; //注意:执行本语句时,表示将当前的 tem结点已经作为某个结点的右孩子
front++; // front++,表示当前队头的右孩子都设置好了,说明队头元素左右孩子都弄完了,就该下一个结点设置左右孩子了,那么就让当前队头出队,将下一个结点设为队头
}
}
}
i++; // 字符数组下标增 1,设置下一个字符元素
}
return root;
}
该图为 第一次执行到 构建右孩子时的示意图:

非递归创建二叉树( C++队列 )的更多相关文章
- c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历
#include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...
- JAVA递归、非递归遍历二叉树(转)
原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...
- 非递归遍历二叉树Java实现
2018-10-03 20:16:53 非递归遍历二叉树是使用堆栈来进行保存,个人推荐使用双while结构,完全按照遍历顺序来进行堆栈的操作,当然在前序和后序的遍历过程中还有其他的压栈流程. 一.Bi ...
- 非递归遍历二叉树Java版的实现代码(没写层次遍历)
直接上代码呵呵,里面有注解 package www.com.leetcode.specificProblem; import java.util.ArrayList; import java.util ...
- c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历
二叉树的创建 思路:数组中从上到下依次放着二叉树中的元素,使用递归很容易实现,那么这里使用容器来存放之前的状态实现循环创建二叉树. TreeNode* createTree(int *arr, int ...
- 剑指offer:对称的二叉树(镜像,递归,非递归DFS栈+BFS队列)
1. 题目描述 /** 请实现一个函数,用来判断一颗二叉树是不是对称的. 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的 */ 2. 递归 思路: /** 1.只要pRoot.left和 ...
- 基于visual Studio2013解决面试题之0401非递归遍历二叉树
题目
- 非递归实现二叉树的三种遍历操作,C++描述
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- JAVA递归、非递归遍历二叉树
前序遍历:1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历:1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 后序遍历:1.后序遍历左子树 2.后序遍历右子树 3.访问根节点-- ...
随机推荐
- postgresql是如何处理死连接(转)
在数据库postgresql中,一个客户端到服务器连接实际上是一个tcp socket连接,tcp连接是虚连接,一方非正常退出(如断电),另一方会继续维持这个连接. 举个例子,一个客户端电脑正常连 ...
- javascript数据结构与算法---队列
javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...
- css3过渡效果
- PHP导出数据到CSV文件函数 csv_export()
后台往往需要导出各种数据到 Excel文档中.通常我们是导出 .csv文件格式,PHP导出函数参考代码如下: /** * 导出数据到CSV文件 * * @param array $data 二维数组( ...
- 利用PHP的register_shutdown_function来记录PHP的输出日志,模拟析构函数
最近在做的一个项目,由于全是通过远程HTTP请求来调用PHP的接口程序. 接收到的参数和返回的内容对开发人员来说都是未知不可见的. 虽然可以通过直接在脚本中模拟请求,但由于实际环境复杂的多,调试极其不 ...
- CentOS6.3 编译安装LAMP(2):编译安装 Apache2.4.6
Apache官方说: 与Apache 2.2.x相比,Apache 2.4.x提供了很多性能方面的提升,包括支持更大流量.更好地支持云计算.利用更少的内存处理更多的并发等.除此之外,还包括性能提升.内 ...
- 聊聊Azure的安全性
本来没打算写这篇博文,毕竟感觉太理论化,不像做技术的人应该写的东西,但是作为一名售前,发现很多不了解Azure的客户,上来的第一个问题竟然就是Azure如何保证客户数据的安全性,我清楚记得我第一次被问 ...
- Uva 2319
理解:区域覆盖.假设该点在勘测半圆的边缘,求出与该点可在一个半圆的坐标范围l,r,然后,for 一次判断 #include<cstdio> #include<algorithm> ...
- Python复习之下划线的含义
__xx__ 系统定义名字 __xx 双下划线的表示的是私有类型的变量.只能是允许这个类本身进行访问了.连子类也不可以 _xx 单下划线 不能用'from moduleimport *'导入 即保护类 ...
- Python:设计模式介绍--单例模式
单例模式 1.单例是只有一个实例2.通过静态字段+静态字段伪造出一个单例效果3.什么时候用:当所有实例中封装的数据相同时,创建单例模式(eg:连接池) 用单例模式创建连接池: class CP: __ ...