根据访问根节点与左右子树的先后顺序,二叉树一般有三种遍历方式:先序遍历、中序遍历和后序遍历。

只要给定中序遍历序列与先序或后序中的一种,可以还原二叉树结构。学习数据结构课程时,一直都只会手动构建还原二叉树。今天试着解决了该问题,记录一下成果。

#include<iostream>
#include<cstdio>
using namespace std; const int maxn = ;
int preorder[maxn], inorder[maxn]; struct Node{
int l, r;
}nodes[maxn]; int build(int pl, int pr, int il, int ir)
{ // 以[pl,pr] [il, ir]建立二叉树,返回根节点 if(pl>pr) return ;
if(il>ir) return ;
int root = preorder[pl]; // 在中序遍历中找到跟节点,分成左右子树递归建树
int pos = il;
while(inorder[pos]!=root) pos++;
int _left = pos - il; nodes[root].l = build(pl+, pl+_left, il, pos-);
nodes[root].r = build(pl+_left+, pr, pos+, ir); return root;
} void PreReverse(int rt)
{ // 先序遍历
cout<<rt<<' '; if(nodes[rt].l) PreReverse(nodes[rt].l); if(nodes[rt].r) PreReverse(nodes[rt].r);
} void PostReverse(int rt)
{ // 后序遍历
if(nodes[rt].l) PostReverse(nodes[rt].l); if(nodes[rt].r) PostReverse(nodes[rt].r); cout<<rt<<' ';
} int main()
{
int N; cin>>N; for(int i=;i<N;i++)
cin>>preorder[i];
for(int i=;i<N;i++)
cin>>inorder[i]; int rt = build(, N-, , N-); PreReverse(rt);
PostReverse(rt); /*
7
3 5 7 6 1 8 2
7 5 1 6 3 8 2 后序遍历结果:
7 1 6 5 2 8 3
*/ return ;
}

稍加修改应该可以解决此题(L2-006 树的遍历),最后输出层序遍历的序列,即BFS。(开始理解错了,对结果没影响)

AC代码如下:

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std; const int maxn = ;
int postorder[maxn], inorder[maxn]; struct Node{
int l, r;
}nodes[maxn]; int build(int pl, int pr, int il, int ir)
{ // 以[pl,pr] [il, ir]建立二叉树,返回根节点 if(pl>pr) return ;
if(il>ir) return ;
int root = postorder[pr]; // 在中序遍历中找到跟节点,分成左右子树递归建树
int pos = il;
while(inorder[pos]!=root) pos++;
int _left = pos - il; nodes[root].l = build(pl, pl+_left-, il, pos-);
nodes[root].r = build(pl+_left, pr-, pos+, ir); return root;
} int main()
{
int N; cin>>N; for(int i=;i<N;i++)
cin>>postorder[i];
for(int i=;i<N;i++)
cin>>inorder[i]; int rt = build(, N-, , N-);
cout<<rt; queue<int> q;
if(nodes[rt].l)
q.push(nodes[rt].l);
if(nodes[rt].r)
q.push(nodes[rt].r); while(!q.empty())
{
int k = q.front(); q.pop();
cout<<' '<<k;
if(nodes[k].l)
q.push(nodes[k].l);
if(nodes[k].r)
q.push(nodes[k].r);
} return ;
}

// 2019.3.21 更新

今天做题发现层序遍历并不是单纯的BFS,在leetcode上碰到这样一个需要严格按照树的层次输出的题:

二叉树结构:  输出结果:

想了半天并没有想到标记每一个层次的办法,搜索解答才恍然大悟,代码非常简单!

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> q;
q.push(root); vector<vector<int> > ans;
if(root==NULL) return ans; while(!q.empty())
{
vector<int> tmp; // 保存每一层的遍历结果
int size = q.size();
while(size--)
{
TreeNode *now = q.front(); q.pop();
tmp.push_back(now->val); if(now->left) q.push(now->left);
if(now->right) q.push(now->right); }
ans.push_back(tmp);
}
return ans;
}
};

L2-006 树的遍历 (层序遍历)的更多相关文章

  1. Hdu1805-Expression(表达式树模版题+层序遍历树+栈的基本应用)

    2018-11-23-02:27:37 原题链接 题目描述: 题目一目了然. 本题思路: 本题很容易能想到是构建表达式树然后按照层序逆序输出即可. AC代码: #include <cstdio& ...

  2. 二叉树(前序,中序,后序,层序)遍历递归与循环的python实现

    二叉树的遍历是在面试使比较常见的项目了.对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁.下面做一个小结. 一.中序遍历 前中后序三种遍历方法对 ...

  3. PTA 7-10 树的遍历(二叉树基础、层序遍历、STL初体验之queue)

    7-10 树的遍历(25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数 ...

  4. Java实现二叉搜索树的添加,前序、后序、中序及层序遍历,求树的节点数,求树的最大值、最小值,查找等操作

    什么也不说了,直接上代码. 首先是节点类,大家都懂得 /** * 二叉树的节点类 * * @author HeYufan * * @param <T> */ class Node<T ...

  5. List Leaves 树的层序遍历

    3-树2 List Leaves (25 分) Given a tree, you are supposed to list all the leaves in the order of top do ...

  6. PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集

    L2-006 树的遍历(25 分)   给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的 ...

  7. PTA 树的遍历(根据后序中序遍历输出层序遍历)

      给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数.第二行给出其后序遍历序列.第 ...

  8. 剑指offer面试题23:从上到下打印二叉树(树的层序遍历)

    题目:从上往下打印出二叉树的每个节点,同一层的结点按照从左往右的顺序打印. 解题思路:二叉树的层序遍历,在打印一个节点的时候,要把他的子节点保存起来打印第一层要把第二层的节点保存起来, 打印第二层要把 ...

  9. PAT 1099. Build A Binary Search Tree (树的中序,层序遍历)

    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...

随机推荐

  1. _IRP struct

    Windows XP x86 +0x000 Type : Int2B +0x002 Size : Uint2B +0x004 MdlAddress : Ptr32 _MDL +0x000 Next : ...

  2. BCZM : 1.8

    问题:      所有的员工均在1楼进电梯的时候,选择所要到达的楼层.然后计算出停靠的楼层i,当到达楼层i的时候,电梯停止.所有人走出电梯,步行到所在的楼层中.求所有人爬的楼层数目和的最小值. 解法一 ...

  3. apache 80 端口 反向代理 tomcat 8080端口

    最近有个jsp的项目要放到服务上,但服务器上已经有了XAMPP(apache + mysql + php), 已占用了80端口.但http默认是访问80端口的. 先把tomcat 环境搭建起来, 发现 ...

  4. Idea中创建maven骨架的命令

    如下:通过命令化在Idea中创建骨架成功后,以后项目直接引用导入骨架直接在依赖框架上面进行相关模块开发: 1.mvn archetype:create-from-project 2.mvn clean ...

  5. lombok使用手册

    lombok使用手册: 1.安装插件 1.1.idel: 1.2.使用lombok还需要引用相关jar包 参考网址:https://projectlombok.org/features/all 2.注 ...

  6. SpringCloudConfig

    方便服务配置文件统一管理,实时更新 组成 在spring cloud config组件中,分两个角色,一是config server,二是config client Config Server是一个可 ...

  7. WebAPI介绍

    Web API介绍 API的概念 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访 ...

  8. XAMPP的安装及使用教程

    https://blog.csdn.net/qq_36595013/article/details/80373597#3%E9%85%8D%E7%BD%AEapache

  9. shiro框架的组成和内部结构(下一篇为spring整合shiro)

    1.shiro简介 Apache Shiro是Java的一个安全框架.功能强大,使用简单的Java安全框架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案. ​ 实际上,Shir ...

  10. SDOI2018

    SD的题有点反人类啊... d1t1[SDOI2018]物理实验 感觉比较好想但不太好写,写了一半弃了 d1t2[SDOI2018]战略游戏 建出圆方树,每次建虚树,答案就是虚树上的原点个数减去询问的 ...