前两篇解释了二叉树的有关逻辑概念及前中后序输出递归代码的实现,这篇将讲述二叉树层次遍历输出如何实现以及二叉树前序遍历输入的两种情况。

定义结构体

struct BiNode{char data;BiNode *lchild,*rchild;
};
typedef BiNode *BiTree;

构造空二叉树

int InitBiTree(BiTree &T)
{T =NULL;return 0;
}

按层次遍历输出二叉树

层次遍历的规则是:从根结点开始,从上到下从左到右逐层遍历。

void LevelTraverse(BiTree T){if(T != NULL)//T不是#就执行{queue<BiTree> q;//新建队列q 队内元素的类型是BiTreeq.push(T);//T入队while(!q.empty())//队列不为空时就执行{BiNode* node = q.front();//取队列首个元素并赋值给nodecout << node -> data;//输出node的值q.pop();//剔除队列首个元素if(node -> lchild != NULL)q.push(node -> lchild);//如果node的左子不为空将左子入队if(node -> rchild != NULL)q.push(node -> rchild);//如果node的右子不为空将右子入队}}
}

层次遍历代码利用队列先进先出的特性来实现,逻辑单元是先将一个根结点入队,用front函数取最先入队的根结点,再把它输出后剔除掉,后续将根结点的左子和右子分别入队;此时队列最前的是左子,按照处理根结点的方法再处理左子;左子剔除后队列最前的是右子,按照同样的方法处理右子,然后是左子的左子...按照这个思路剔除一个根结点进来左子和右子,直到最后一层,所有叶子结点输出后,树中再无元素,此时,队列中也空了 ,按层次遍历输出结束。由此可见,逻辑单元执行的条件是队列不为空。

总结代码的结构就是:

1、判断树不为空后先定义队列并把根入队;

2、输出并剔除根结点;

3、将左子和右子入队;

4、直到队列为空时输出结束;

注意这里的根、左子、右子都是相对而言的,一些结点它既是它父结点的子也是它子结点的根,所以它是根是子按需要定义。

按前序遍历输入二叉树

方法一

输入字符串为二叉树的带虚结点表示的前序遍历序

char *CreateBiTree(BiTree &T,char *str)
{//约定#表示空结点if(*str == '#'){T = NULL;return str+1;}//创建结点T = new BiNode;T->data = *str;//继续输入并构造左子树和右子树char * strAfterLeft = CreateBiTree(T->lchild, str + 1);char * strAfterRight = CreateBiTree(T->rchild, strAfterLeft);//返回剩余字符串return strAfterRight;
}

该段代码我的理解方式是用手运行一遍,这里举例输入的字符串为ab##c##,建议大家用手运行一下然后不懂的地方再看我下面的解释,不亲手运行只看别人的理解很难看下去。

*str指向a,a不是#,创建一个结点T,T的值为a;

运行strAfterLeft1这一行,str+1所以str指向了b,b不是#,创建新结点,a->lchild的值是b;

再次运行strAfterLeft2这一行,str +1所以str指向了#,#是#,b->lchild为NULL,返回str + 1,strAfterLeft2指向了#;

再运行strAfterRight2这一行,strAfterLeft2指向了#,所以b->rchild为NULL,返回str +1给strAfterRight2,strAfterRight2指向了c,再返回strAfterRight2给strAfterLeft1;

再运行strAfterRight1这一行,c不是#,创建新结点所以a->rchild的值为c,后续右子树c的遍历与b一样;

方法二

输入为样例个数及多个二叉树的带虚结点表示的前序遍历序或单个二叉树的带虚结点表示的前序遍历序

void ManuallyCreateTree(BiTree & T)
{T = new BiNode;char q;cin >> q;if(q == '#')T = NULL;else{T -> data = q;ManuallyCreateTree(T->lchild);ManuallyCreateTree(T->rchild);}
}

因为输入为二叉树的带虚结点表示的前序遍历序,所以构造一种完全模拟二叉树前序遍历法则的函数,将字符一个个添加到二叉树中,最终由一个根搭建起整棵树。

//这篇的内容到这里就结束啦 欢迎大家批评指正( ¨̮ )

树(二叉树层次遍历输出及二叉树前序遍历输入)相关推荐

  1. 二叉树遍历算法之一:前序遍历

    递归实现前序遍历 二叉树的前序遍历是指从根节点出发,按照先根节点,再左子树,后右子树的方法遍历二叉树中的所有节点,使得每个节点都被访问一次. 当调用遍历算法的时候前序遍历的具体过程如下: 首先访问根节 ...

  2. LeetCode 297. 二叉树的序列化与反序列化(前序遍历层序遍历)

    文章目录 1. 题目 2. 解题 2.1 前序遍历 2.2 层序遍历 1. 题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过 ...

  3. 【二叉树遍历迭代伪代码】前序遍历、中序遍历、后序遍历

    前序遍历伪代码: 栈s; p = root; while(p || s 不为空)while(p)访问p:p右入栈:p = p左: p = s顶:弹出s顶:} }后序遍历: 栈s; p = root; ...

  4. python实现二叉树的重建1 之由前序遍历和中序遍历重建

    前言 此题是关于树的面试题目的常见题型,题目的含义很清晰,这个就不用多说了 解法 关于这道题的解法有很多不同的样式,通用的解法是这样的: 假如现在我们有如下两个遍历的情况 preorder: [1, ...

  5. python数组遍历输出所有组合_python遍历列表和数组实例讲解

    python遍历实例总结 python同时遍历数组的索引和值的实例 你想在迭代一个序列的同时跟踪正在被处理的元素索引. 获取索引 内置的 enumerate() 函数可以很好的解决这个问题: > ...

  6. 数据结构 | 第十一章:二叉树和其他树 | 【前序遍历】【中序遍历】【后序遍历】【层次遍历】 | 并查集

    第5-10章:线性结构,元素之间存在线性次序(线性表.数组与矩阵.栈.队列.跳表和散列表 第11-15章:层次结构(二叉树和树.优先队列.竞赛树.搜索树) 文章目录 11.1 树 11.2 二叉树 1 ...

  7. php 实现二叉树的最大深度_PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)...

    前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历.中序遍历.后序遍历.具体说明如下: 前序遍 ...

  8. 二叉树(前序遍历序列、中序遍历序列、后序遍历序列、层次遍历序列、深度、叶子数)

    Description 已知二叉树的一个按前序遍历输入的字符序列,如abc,de,g,f, (其中,表示空结点).请建立二叉树,并输出建立二叉树的前序遍历序列.中序遍历序列.后序遍历序列.层次遍历序列 ...

  9. 二叉树:通过前序遍历与中序遍历序列输出二叉树的后序遍历序列

    题目描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树: 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树: 后序遍历: ...

最新文章

  1. 如何将广告始终定位到网页右下角
  2. 最新!全球学术排名出炉:18所中国大学位居世界100强
  3. 国内网站安全测试6大步骤
  4. SPARK STREAMING之1:编程指南(翻译v1.4.1)
  5. python大数据运维库_大数据集群运维(10)Pycharm下安装模块
  6. matlab盒子分形维数_分形维数--matlab
  7. win10睡眠按啥键唤醒_防止Windows10自动唤醒,就用这4招,维修电脑必知
  8. 在linux centos 7上安装maven
  9. ue4cmd怎么调用_虚幻引擎UE4-命令行使用的一些详细技巧
  10. JAVA基础系列:Object类
  11. 并发-阻塞队列源码分析
  12. UVA1584 UVALive3225 Circular Sequence【水题】
  13. 关闭centos6.7不必要的服务
  14. python条件判断天气_Python小课—条件判断—学习笔记(4)
  15. 【十大IDE】 解决你不懂英文的痛苦
  16. iPhone铃声制作软件iRingg for Mac
  17. [笔记] 关于通过鼠标滚轮设置缩放的技巧
  18. Python queue
  19. 配置linux网络的坑之IPADDR 等出现Command not found
  20. MATLAB的Roberts算子与Sobel算子

热门文章

  1. Sublime Text 3 下载安装、注册、汉化
  2. 为什么流行双频无线路由器 优点告诉你
  3. CLion中文乱码问题解决
  4. Markdown中的图标是什么,为什么不是图片却可以以图片方式显示?
  5. ae破碎效果在哪_利用Ae制作出破碎效果的详细步骤
  6. 【PTA】7-2 单链表基本操作 (25 分)
  7. excel将筛选项的行全删掉
  8. tpc-ds基准测试案例-hive
  9. classList 添加、删除、切换类名
  10. PS3文件的打开新建及储存,PS4移动工具图层感念,PS5矩形选框工具组选区感念,