非递归创建二叉树( 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.访问根节点-- ...
随机推荐
- css之div等继承问题--待续
div哪些属性是可以继承的呢? 亲测:float可以继承(错的,见下解答,),display不可以继承.有待继续学习. float不可以继承, 简单来说:浮动的元素,顾名思义,就是这个元素“浮起来”了 ...
- 关于使用 no-js (Modernizr)
最近有些朋友问到:为什么我的网页 code 有 class="no-js" ? <!DOCTYPE html> <html dir="ltr" ...
- tyvj1938 最优战舰
描述 太空战队顺利地完成了它的第一次使命,这一行动的受益者陆军本部当即决定,请陆军的战士们投票选出最优战舰并报司令总部进行表彰.为防止有人利用高科技手段造假,陆军本部决定使用最原始的方法进行投票.可不 ...
- ngnix 配置CI框架 与 CI的简单使用
ngnix 支持 CI框架1.修改config.php 参考网址:https://www.chenyudong.com/archives/codeigniter-in-nginx-and-url-re ...
- 【Alpha版本】 第二天 11.8
一.站立式会议照片: 二.项目燃尽图: 三.项目进展: 成 员 昨天完成任务 今天完成任务 明天要做任务 问题困难 心得体会 胡泽善 我要招聘详情的展示 注册界面的实现 填写招聘时用户填写各个日期到可 ...
- Oracle 查看某表 被哪些表外键引用
分2步骤: 1. select * from user_constraints e where e.table_name='xxx'; 2. select a.constraint_type,a.ta ...
- Wireshark抓包工具
首先下载并安装Wireshark软件,最好选择中文版,因为会使你用的更顺手. 安装完毕之后,双击打开Wireshark软件,主界面还是比较清晰明了的,可是怎么用还是稀里糊涂的吧. 点击菜单栏红圈中的选 ...
- python 内置&&递归
lambda 优点: 1:可以简单使用一个脚本来替代我们的函数 2:不用考虑命名的问题 3:简化代码的可读性,不用跳转到def了,省去这样的步骤 内置函数:bif filter:过滤器 map:映射 ...
- webstormkey
webStorm : UserName:William ===== LICENSE BEGIN ===== 45550-12042010 00001SzFN0n1bPII7FnAxnt0DDOPJA ...
- 多个SVG图形集成到一个SVG图形上
SVG:使用XML格式定义图像的可缩放矢量图形(Scalable Vector Graphics). 优点就不多说了,下面看看怎么将多个svg图形集成到一个svg图形上. 如果使用bootstrap框 ...