1. 程式人生 > >根據二叉樹前序遍歷和中序遍歷序列求解後序遍歷的演算法

根據二叉樹前序遍歷和中序遍歷序列求解後序遍歷的演算法

問題模型:已知某二叉樹前序遍歷序列為1,2,3,4,5,6,中序遍歷為3,2,4,1,6,5,設計程式計算後序序列。

關於這個問題你可以通過前序遍歷和中序遍歷建立一顆樹,然後通過後序遍歷進行求解,當然還可以直接根據已知兩序列直接推理後序序列,本文將對這種分析進行介紹。

利用遞迴的思想,從前序序列可以確定根節點即首位元素,根據中序序列可以確定左右子樹的節點集合,然後針對左右子樹分別進行繼續判定,具體演算法表達如下:

void solve( int preL, int inL, int postL, int n )
{ if (n==0) return;
if (n==1) {post[postL] = pre[preL]; return;}
root = pre[preL];
post[postL+n-1] = root;
for (i=0; i<n; i++)
if (in[inL+i] == root) break;
L = i; R = n-L-1;
solve(preL+1, inL, postL, L);
solve(preL+L+1, inL+L+1, postL+L, R);
}
其中preL,inL,postL為3種序列首位座標,陣列pre,in,post分別表示序列,函式每執行一次即可確定一個區域性子樹的根節點在後序序列的位置,遞迴左右子樹關鍵位置在於前中後序的首位位置,遞迴的結束條件(當n=0時,說明該子樹的節點數量為0,不存在後序序列,所以就直接返回;當n=1時,說明該子樹節點個數為1,序列就是節點自己,直接賦值即可)也是程式成功的關鍵。