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

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

#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. Oracle SQL外连接

    SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同.连接类型        定义内连接           只连接匹配的行左外连接     ...

  2. 查看Linux 内核版本命令

    1.Ubuntu 查看版本命令,三种方法. 1.使用  "uname -a" 2.使用  "lsb_release -a"   3.使用  "cat ...

  3. css3 动画属性

    transition Internet Explorer 9 以及更早版本的浏览器不支持 transition 属性. Internet Explorer 10.Firefox.Opera 和 Chr ...

  4. iOS开发系列-LLVM、Clang

    LLVM LLVM计划启动于2000年,最初由University of Illinois at Urbana-Champaign的Chris Lattner主持开展. 我们可以认为LLVM是一个完整 ...

  5. LightOJ 1342 Aladdin and the Magical Sticks 期望(结论题)

    题目传送门 题意:n根木棍,每根木棍都有一个权值,木棍有可识别的木棍和不可识别的木棍,每次抽取木棍时,会累加权值,如果是可识别的木棍就不放回,不可识别的木棍就放回,问每根木棍至少被抽取一次,权值的期望 ...

  6. 2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

    redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略.redis 提供 6种数据淘汰策略: voltile-lru:从已设置过期时间的数据集(server.db[i].expires) ...

  7. 廖雪峰Java16函数式编程-1Lambda表达式-3方法引用

    Java8引入了Lambda表达式,可以不必编写FunctionalInterface的实现类,直接写Lambda表达式.除了Lambda表达式,我们还可以直接传入方法引用 方法引用是指:如果某个方法 ...

  8. Windows 设置IP解决方案

    { super + e / windows + e Mouse Right play down network link }

  9. C++如何判断某一文件是否存在

    函数名: access 功 能: 确定文件的访问权限 用 法: int access(const char *filename, int amode); 程序例: #include <stdio ...

  10. Android NDK应用原理

    转:http://shihongzhi.com/ndk/ 那么首先看一下Android的系统框架: 最底层是Linux Kernel,然后上面是封装的库及Android runtime.再上面是App ...