根據先序和中序輸出後序遍歷
阿新 • • 發佈:2019-01-10
題目描述:
二叉樹的前序、中序、後序遍歷的定義: 前序遍歷:對任一子樹,先訪問跟,然後遍歷其左子樹,最後遍歷其右子樹; 中序遍歷:對任一子樹,先遍歷其左子樹,然後訪問根,最後遍歷其右子樹; 後序遍歷:對任一子樹,先遍歷其左子樹,然後遍歷其右子樹,最後訪問根。 給定一棵二叉樹的前序遍歷和中序遍歷,求其後序遍歷(提示:給定前序遍歷與中序遍歷能夠唯一確定後序遍歷)。
輸入描述:
兩個字串,其長度n均小於等於26。 第一行為前序遍歷,第二行為中序遍歷。 二叉樹中的結點名稱以大寫字母表示:A,B,C....最多26個結點。
輸出描述:
輸入樣例可能有多組,對於每組測試樣例, 輸出一行,為後序遍歷的字串。
輸入樣例:
ABC
BAC
FDXEAG
XDEFAG
輸出樣例:
BCA
XEDGAF
相關知識:
1.先序遍歷的遞迴過程為:若二叉樹為空,遍歷結束。否則:①訪問根結點;②先序遍歷根結點的左子樹;③先序遍歷根結點的右子樹。 簡單來說先序遍歷就是在深入時遇到結點就訪問。
2.中序遍歷的遞迴過程為:若二叉樹為空,遍歷結束。否則:①中序遍歷根結點的左子樹;②訪問根結點;③中序遍歷根結點的右子樹。簡單來說中序遍歷就是從左子樹返回時遇到結點就訪問。
3.後序遍歷的遞迴過程為:若二叉樹為空,遍歷結束。否則:①後序遍歷根結點的左子樹;②後序遍歷根結點的右子樹;③訪問根結點。簡單來說後序遍歷就是從右子樹返回時遇到結點就訪問。
AC程式碼:
#include <bits/stdc++.h> using namespace std; void getpost(string preorder,string inorder) //根據先序和後序求中序 { int n = preorder.length(); //n為每次遍歷數目 if(n > 0) { char root = preorder[0]; //根結點為先序遍歷的第一個 int i = inorder.find(root); //中序遍歷中根結點的所在下標 getpost(preorder.substr(1,i),inorder.substr(0,i)); //左子樹 getpost(preorder.substr(i+1),inorder.substr(i+1)); //右子樹 cout << root; } } int main() { string preorder,inorder; //先序遍歷和中序遍歷 while(cin >> preorder >> inorder) { getpost(preorder,inorder); cout << endl; } return 0; }