天梯賽練習題L2-006. 樹的遍歷

題目連接node

已知一棵樹的後序遍歷順序和中序遍歷順序,求層次遍歷的順序;ios

樹的四種遍歷:數組

先序遍歷:先訪問根節點,再訪問左子樹,最後訪問右子樹ide

中序遍歷:先訪問左子樹,再訪問根節點,最後訪問右子樹spa

後序遍歷:先訪問左子樹,再訪問右子樹,最後訪問根節點code

層次遍歷:一層一層的訪問;blog

 

徹底二叉樹的節點關係,在層次遍歷中假設根節點的編號是n,左子樹的根節點是2*n,右邊是2*n+1;排序

 

本題是已知後序a和中序b:遞歸

 因爲後序遍歷最後訪問根節點因此,數組a的最後一個節點必定是根節點,而後在數組b中找到根節點的位置,該位置左邊部分必定是該節點的左子樹,右邊部分必定是右子樹的部分,而後根據左邊的元素找到在a中的對應位置,靠後面的那個就是子樹的根節點,一次遞歸下去便可;get

注意的就是對應區間在a和b數組上的位置關係;

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include <map>
#include <vector>
using namespace std;

#define N 31
#define INF 0x3f3f3f3f

int a[N], b[N], n, p;
///a數組保存後序,b保存中序,c.num保存層次,c.pos是當這個數是徹底二叉樹時的位置;
struct node
{
    int pos, num;
}c[300];

void dfs(int aL, int aR, int pos, int bL, int bR)
{
    if(bL > bR || aL > aR)
    {
        //c[pos] = -INF;
        return;
    }

    //c[pos] = a[aR];
    c[p].num = a[aR];
    c[p++].pos = pos;

    for(int i=bL; i<=bR; i++)
    {
        if(b[i] == a[aR])///根節點是a[aR];
        {
            dfs(aL, aL+i-bL-1, pos*2, bL, i-1);///當前根節點左子樹在a數組中的下標是[aL, aL+i-bL-1],在b中的是[bL, i-1];
            dfs(aR-(bR-i), aR-1, pos*2+1, i+1, bR);///當前根節點右子樹在a數組中的下標是[aL-(bR-i), aR-1],在b中的是[bL, i-1];
        }
    }
}

int cmp(node p, node q)
{
    return p.pos < q.pos;
}

int main()
{
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
        scanf("%d", &a[i]);
    for(int i=1; i<=n; i++)
        scanf("%d", &b[i]);

    p = 0;

    dfs(1, n, 1, 1, n);

    sort(c, c+p, cmp);///按編號進行排序;

    int flag = 0;

    for(int i=0; i<p; i++)
    {
        if(flag == 0)
        {
            printf("%d", c[i].num);
            flag = 1;
        }
        else
            printf(" %d", c[i].num);
    }
    printf("\n");

    return 0;
}
View Code
相關文章
相關標籤/搜索