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

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

#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. docker使用gitlab持续集成(1)

    修改ssh连接端口vi /etc/ssh/sshd_config 写docker-compose.yml文件配置gitlab version: '3' services: gitlab: image: ...

  2. Android开发 如何最优的在Activity里释放资源

    前言 当前你已经入门Android开发,开始关注深入的问题,你就会碰到一个Android开发阶段经常碰到的问题,那就是内存泄漏. 其实大多数Android的内存泄漏都是因为activity里的资源释放 ...

  3. vue type check failed for prop . Expected Number, got String

    代码是:fileNumLimit接收的类型是Number <vue-upload fileNumLimit='100'/> 改为 <vue-upload :fileNumLimit= ...

  4. 93. 复原IP地址

    题目描述: 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135&q ...

  5. IDEA快捷键(收集自网络后整理)

    快捷键 说明 CTRL+B 快速打开光标处的类或方法 CTRL+C 拷贝 CTRL+D 复制当前行到下一行 CTRL+E 最近打开的文件 CTRL+F 当前文件查找特定内容 CTRL+G 定位行 CT ...

  6. js 异步编程思想

    一.js中的异步编程有四种情况 1.定时器 2.所有的事件绑定 3.ajax异步请求 4.回调函数

  7. Java集合综述

    Java集合图,虚线框为接口,实线框是具体的类 具体实现类 基本使用 (1)List: List基本操作 ArrayList<String> arrayList = new ArrayLi ...

  8. 杂项-Maven-guava:guava

    ylbtech-杂项-Maven-guava:guava Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库.这个库是为了方便编码,并减少编码错误.这个库提供用于集合 ...

  9. System.Web.Mvc.HttpPatchAttribute.cs

    ylbtech-System.Web.Mvc.HttpPatchAttribute.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, ...

  10. C#实现拍照并且存水印照片

    由于一直在高校工作,就涉及到招生工作,招生时候又要收集学生图像采集,所以就随手写了一个图像采集工具,废话不多说,进入正题. 图像采集需要调用摄像头就行拍照操作,网上查了一下资料,需要引用以下3个dll ...