美文网首页
二叉树遍历

二叉树遍历

作者: 四川孙一峰 | 来源:发表于2017-03-06 22:28 被阅读0次

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出样例:

4 1 6 3 5 7 2

分析

对于后序遍历序列 : 最后一个值是根,前面一部分是左儿子 , 中间一部分是右儿子。
比如样例 : 4 是根 , 231 是左儿子 , 576 是右儿子。

如何找到哪一段是左儿子,哪一段是右儿子 ?

看中序遍历序列 : 在中序遍历序列中找到根 4 。 它左边有3个数,全是它的左儿子。右边同理。
这样就找到左儿子是有三个数 , 右儿子是有 3 个数的,这样看回后序遍历序列。就知道前三个数是左儿子,紧接着的3个数是右儿子。

就这样慢慢还原一棵树。然后bfs层序输出。

代码如下

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#define CLR(x) memset(x,0,sizeof(x))
#define LL long long
using namespace std;
int mid[50],hou[50];

struct node{
    int l , r;
}a[50];

int build(int la,int ra,int lb,int rb){
    if(la > ra) return 0;
    int rt = hou[rb];
    int p1 = la , p2 ;
    while(mid[p1] != rt) p1++;
    p2 = p1 - la;
    a[rt].l = build(la,p1-1,lb,lb+p2-1);
    a[rt].r = build(p1+1,ra,lb+p2,rb-1);
    return rt;
}

void bfs(int x)
{
    queue<int> q;
    vector<int> g;
    q.push(x);
    while(!q.empty()){
        int w = q.front();
        q.pop();
        if(w == 0) break;
        g.push_back(w);
        if(a[w].l != 0){
            q.push(a[w].l);
        }
        if(a[w].r != 0){
            q.push(a[w].r);
        }
    }
    for(int i = 0 ; i < g.size() ; i++){
        printf("%d%c",g[i],i==g.size()-1 ? '\n' : ' ');
    }
    return;
}

int main()
{
    int n;
    cin >> n;
    for(int i = 0 ; i < n ; i++) cin >> hou[i];
    for(int i = 0 ; i < n ; i++) cin >> mid[i];
    build(0,n-1,0,n-1);
    int root = hou[n-1];
    bfs(root);
}

相关文章

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 关于二叉树的算法题

    前序遍历中序遍历后序遍历判断是否是平衡二叉树判断是否是对称二叉树判断二叉树高度按照层遍历二叉树判断二叉树宽度

  • 二叉树遍历

    二叉树 二叉树的存储结构 前序遍历 中序遍历 后序遍历 遍历代码 反转二叉树 深入学习二叉树 二叉树-你必须要懂!...

  • 二叉树操作

    树节点 逐行顺序解析二叉树 前序遍历二叉树 中序遍历二叉树 后序遍历二叉树 删除指定数值的节点 前序遍历顺序存储的...

  • 数据结构与算法之二叉树遍历(七)

    目录 前序遍历中序遍历后序遍历层序遍历遍历方式的选择条件根据遍历结果重构二叉树翻转二叉树计算二叉树的高度判断一棵树...

  • 二叉树三种遍历Swift代码实现

    二叉树的三种遍历 二叉树 前序遍历 中序遍历 后序遍历 另外 不得不说,得到二叉树的前序遍历和中序遍历的结果或者后...

  • 二叉树的遍历

    二叉树的遍历 二叉树遍历 分为前序遍历、中序遍历和后序遍历。 前序遍历 (DLR) 先访问根节点,然后前序遍历左子...

  • 前端二叉树

    (一)构造二叉树 (二)中序遍历 (三)前序遍历 前序遍历可以复制二叉树,效率比重新构造二叉树高 (四)后序遍历 ...

  • 数据结构:树的实现和遍历(c++)

    (一)二叉树的遍历——递归实现 二叉树常见的遍历方式分为前序遍历、中序遍历和后序遍历。 1 前序遍历 前序遍历也叫...

  • leetcode 144 145 94

    二叉树遍历 前序遍历 中序遍历 后序遍历

网友评论

      本文标题:二叉树遍历

      本文链接:https://www.haomeiwen.com/subject/iccpgttx.html