題目連接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; }