通過中序遍歷、後序遍歷求先序遍歷
阿新 • • 發佈:2018-11-15
用上圖二叉樹作為一個例子
中序遍歷:8 4 9 2 10 5 1 6 3 7
後序遍歷:8 9 4 10 5 2 6 7 3 1
1.首先我們通過後序遍歷尋找整顆二叉樹的根結點,由於後序遍歷的特點為 “左右根 ”,所以後邊遍歷的最後一個值便是根節點的值,根節點值為1
2.由於中序遍歷的特點為“左根右”,我們知道了根節點後,便可以推出根節點的左子樹與右子樹
3.在左子樹中遞迴剛才的過程
4.在右子樹中遞迴剛才的過程
所以在上圖樹中,我們先找到了根節點為1,然後左子樹中序遍歷為8 4 9 2 10 5 ,左子樹後序遍歷為 8 9 4 10 5 2,我們又找到了左子樹的根節點為2,然後左子樹的左子樹中序遍歷便為8 4 9……(以此類推,遞迴演算法)
通過中序遍歷、後序遍歷 輸出先序遍歷,下面的程式碼在解決過程中未建立二叉樹。
#include<stdio.h> #include<stdlib.h> void fun(char*inorder, char*postorder, int length) { if (length == 0) return; int rootindex = 0; for (; rootindex < length; rootindex++) if (inorder[rootindex] == postorder[length - 1]) break; printf("%c", inorder[rootindex]); fun(inorder, postorder, rootindex); fun(inorder + rootindex+1, postorder+rootindex, length - rootindex-1); }
int main() { int length; printf("請輸入二叉樹的結點數:"); scanf("%d",&length); getchar(); char*Inordertree;//中序 char *Postordertree;//後序 Inordertree = (char*)malloc(length*sizeof(char)); Postordertree = (char*)malloc(length*sizeof(char)); int i; printf("請輸入二叉樹的中序遍歷(回車結束)"); for (i = 0; i < length; i++) scanf("%c",&Inordertree[i]); getchar(); printf("請輸入二叉樹的後序遍歷(回車結束)"); for (i = 0; i < length; i++) scanf("%c",&Postordertree[i]); getchar(); printf("二叉樹的先序遍歷為:"); fun(Inordertree, Postordertree, length); printf("\n"); system("pause"); return 0; }
效果展示(10用A代替)
通過先序遍歷、中序遍歷求後序遍歷 方法與此類似。
如果希望建立二叉樹,那麼上述方法可以給你提供一點點小思路~