已知前序遍歷和中序遍歷,求後序遍歷的程式實現
阿新 • • 發佈:2019-01-03
已知兩種遍歷,求第三種遍歷是資料結構的常考題, 現在用程式設計的方式來實現:
已知前序遍歷和中序遍歷, 求後序遍歷.
雖然這個問題我們用手畫畫就得出答案了,而程式設計的話反而不知道如何下手. 實際上,我們都會直觀地知道關於遍歷的問題肯定使用堆疊或者遞迴的方式完成. 而遞迴則更好理解.
後續遍歷為 左子樹-右子樹-根. 而中序遍歷中, 每個節點的左右子樹都分列兩端. 所以我們可以以中序遍歷為基礎來得到後序遍歷. 而前序遍歷可以提供給我們當下根節點的位置(因為前序遍歷優先遍歷根節點, 因此從前讀到後就是所有的 根.
說的不太清楚, 程式很好理解:
n 從前序序列中從前往後走,第一個點是根節點, 所以根據這個點將中序序列分成兩半,然後最後列印這個點(後序遍歷).#include<iostream> #include<algorithm> #include<string> using namespace std; string inorder,preorder; int n=-1; void f (int i,int j) { if(i>j) return; n++; int k; for( k=i;k<=j;k++) { if(inorder[k]==preorder[n]) break; } f(i,k-1); f(k+1,j); cout<<inorder[k]; } int main() { cin>>preorder>>inorder; f(0,preorder.length()-1); }
在每一次遞迴中, 每個遞迴的根節點都是按遞迴的先後順序出現在前序序列中的