樹的遍歷(前序中序求後序,後序中序求前序)

首先必需要有中序遍歷以及前序和後序之中的一種才能求第三種,也就是說沒有中序遍歷樹的結構是不肯定的。c++

首先中序,前序,求後序:

#include<bits/stdc++.h>
using namespace std;
const int N=100000;
int f[N],m[N],n;
void solve(int x,int y,int n){//x表示當前子樹的前序遍歷的第一個數字的位置,y表示當前子樹中序遍歷的第一個數字的位置,n表示當前子樹的節點個數
    if(n==1){
        cout<<f[x]<<' ';
        return ;
    }
    if(n==0) return;
    int i=0;
    while(m[y+i]!=f[x]) i++;
    solve(x+1,y,i);
    solve(x+i+1,y+i+1,n-i-1);
    cout<<f[x]<<' ';
}
int main(){
    int n;cin>>n;
    for(int i=1;i<=n;i++) cin>>m[i];
    for(int i=1;i<=n;i++) cin>>f[i];
    solve(1,1,n);
    cout<<endl;
    return 0;
}

 

後序,中序求前序:

#include<bits/stdc++.h>
using namespace std;
const int N=100000;
int b[N],m[N],n;
void solve(int x,int y,int n){//x表示當前子樹後續遍歷的最後一個數字,y表示當前子樹中序遍歷的最後一個數字,n表示當前子樹的節點個數
    if(n==1){
        cout<<b[x]<<' ';
        return ;
    }
    if(n==0) return;
    int i=0;
    while(m[y-i]!=b[x]) i++;
    cout<<b[x]<<' ';
    solve(x-i-1,y-i-1,n-i-1);
    solve(x-1,y,i);
}
int main(){
    int n;cin>>n;
    for(int i=1;i<=n;i++) cin>>b[i];
    for(int i=1;i<=n;i++) cin>>m[i];
    solve(n,n,n);
    cout<<endl;
    return 0;
}
相關文章
相關標籤/搜索