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

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

#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. centos7.3更换ssh默认登陆端口

    说明:本方法目前通用于7.1-7.3 vim /etc/ssh/sshd_config 找到Port 22下面添加一行:Port 12345保存退出. systemctl restart sshd.s ...

  2. IDEA 打开Run Dashboard 分组启动

    一,项目文件夹中,找到 .idea-->workspace.xml 添加: <component name="RunDashboard"> <option ...

  3. python库之lightgbm

    一.安装 https://blog.csdn.net/qq_40317897/article/details/81021958 参考文献: [1].LightGBM中文文档 https://light ...

  4. FCC——相关练习

    算法题目1:Seek and Destroy(摧毁数组) 金克斯的迫击炮! 实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值. 帮助资源: Arguments ...

  5. window 系统上传文件到linux 系统出现dos 格式换行符

    Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行,所以为了避免这种情况的发生,我们可以 ...

  6. ASCII, Unicode 与 UTF-8

    1,ASCII 由于计算机是美国人发明的,最早只有127个字符,即大小写英文字母.数字.一些符号,被编码到计算机里,这个编码表就是ASCII表.这时每个字符用1 Byte表示. 2,Unicode 当 ...

  7. matplotlib 画图颜色参数值及对应色卡

     matplotlib 色卡对应参数值 cnames = { 'aliceblue': '#F0F8FF', 'antiquewhite': '#FAEBD7', 'aqua': '#00FFFF', ...

  8. Windows 关闭win32 控制台

    {     fclose(pf); BOOL ret = FreeConsole(); }

  9. spring mvc多环境下配置文件的设置

    在实际开发时经常需要把一些配置信息写在配置文件,比如mysql的主机地址.端口号.用户名和密码等.另外,在开发代码时可能用一套配置参数,而部署到测试环境时又会用另一套配置参数,测试完毕再部署到线上环境 ...

  10. System.Drawing.Graphics.cs

    ylbtech-System.Drawing.Graphics.cs 1.程序集 System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKey ...