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

 初始化: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++队列 )的更多相关文章

  1. c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历

    #include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...

  2. JAVA递归、非递归遍历二叉树(转)

    原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...

  3. 非递归遍历二叉树Java实现

    2018-10-03 20:16:53 非递归遍历二叉树是使用堆栈来进行保存,个人推荐使用双while结构,完全按照遍历顺序来进行堆栈的操作,当然在前序和后序的遍历过程中还有其他的压栈流程. 一.Bi ...

  4. 非递归遍历二叉树Java版的实现代码(没写层次遍历)

    直接上代码呵呵,里面有注解 package www.com.leetcode.specificProblem; import java.util.ArrayList; import java.util ...

  5. c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历

    二叉树的创建 思路:数组中从上到下依次放着二叉树中的元素,使用递归很容易实现,那么这里使用容器来存放之前的状态实现循环创建二叉树. TreeNode* createTree(int *arr, int ...

  6. 剑指offer:对称的二叉树(镜像,递归,非递归DFS栈+BFS队列)

    1. 题目描述 /** 请实现一个函数,用来判断一颗二叉树是不是对称的. 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的 */ 2. 递归 思路: /** 1.只要pRoot.left和 ...

  7. 基于visual Studio2013解决面试题之0401非递归遍历二叉树

     题目

  8. 非递归实现二叉树的三种遍历操作,C++描述

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  9. JAVA递归、非递归遍历二叉树

    前序遍历:1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历:1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 后序遍历:1.后序遍历左子树 2.后序遍历右子树 3.访问根节点-- ...

随机推荐

  1. Rabbitmq Exchange Type 说明

    Exchange在定义的时候是有类型的,以决定到底是哪些Queue符合条件,可以接收消息 fanout 所有bind到此exchange的queue都可以接收消息 direct 通过routingKe ...

  2. XMPP开发环境配置

    首先配置XMPP开发环境配置需要的软件 先安装xampp-osx-1.8.3-5-installer.dmg 安装成功后launchpad里会多出一个XAMPP(其他),点开里面的manager-os ...

  3. 每秒执行一个shell脚本(转载)

      上周迁移了一台服务器,发现其中一个项目的数据没有更新,查询原服务器的数据,数据有更新,并找到了rsync服务,从其他服务器传输数据,那么如何找到这台服务器?因为是从远程传输到本地,而且不是很频繁, ...

  4. MSYS2的源配置

    关于MSYS2的文章可以参考下面的链接,笔者不多赘述: msys2安装笔记 MSYS2 + MinGW-w64 + Git + gVim 环境配置 msys2环境搭建 msys2安装g++: pacm ...

  5. 【阿里李战】解剖JavaScript中的 null 和 undefined

    在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理.于是,细想之后,写下本文,请各位 ...

  6. 利用PHP的register_shutdown_function来记录PHP的输出日志,模拟析构函数

    最近在做的一个项目,由于全是通过远程HTTP请求来调用PHP的接口程序. 接收到的参数和返回的内容对开发人员来说都是未知不可见的. 虽然可以通过直接在脚本中模拟请求,但由于实际环境复杂的多,调试极其不 ...

  7. 第2月第25天 BlocksKit

    1.blockskit https://github.com/zwaldowski/BlocksKit bk_showAlertViewWithTitle 2.toast +(void)showToa ...

  8. POJ2195 最小费用流

    题目:http://poj.org/problem?id=2195 处理出每个人到每个门的曼哈顿距离,分别建立容量为1费用为曼哈顿距离的边,在源点和每个人人之间建立容量为1费用为0的边,在门和汇点之间 ...

  9. HTTP参数污染

    HTTP Parameter Pollution简称HPP,所以有的人也称之为“HPP参数污染”. 一篇很不错关于HPP参数污染的文章:http://www.paigu.com/a/33478/235 ...

  10. SharePreferences的DB实现

    存储一些简单数据的时候,最快的实现是用SharePreferences,但SharePreferences的可靠性不高,在某些非官方ROM上,总是存取失败.后来想到用数据库来存取.产品中,存取的数据项 ...