(C語言-資料結構與演算法)還原二叉樹
阿新 • • 發佈:2019-01-30
/*根據先序和中序遍歷輸出的字串還原二叉樹,然後輸出後序遍歷*/ #include<stdio.h> #include<stdlib.h> #define MAX 20 char preOrder[MAX] = "abdgcefh";//定義全域性變數,先序字串 char midOrder[MAX] = "dgbaechf";//中序字串 struct TreeNode { char data; TreeNode *Lnode; TreeNode *Rnode; }; void subLm(char A[], char B[], char C);//獲取中序遍歷的左邊 void subRm(char A[], char B[], char C);//獲取中序遍歷的右邊 int subLp(char A[], char B[], int C);//獲取先序遍歷的左邊 void subRp(char A[], char B[], int C);//獲取先序遍歷的右邊 int strlength(char * str);//計算長度 char captureA(char temp[]);//該函式返回值為傳遞字串的首字元,並且字串全體向前移動1格,覆蓋掉首字元 void formPrint(TreeNode *T);//後序輸出二叉樹 TreeNode *restore(TreeNode *&T, char Pc[], char Mc[]);//還原二叉樹 void main() { TreeNode *T = NULL;//定義頭結點然後初始化 restore(T, preOrder, midOrder);//傳遞全域性變數先序和後序的字串 formPrint(T); } int strlength(char * str) { int a = 0; while (*str++ != '\0') a++; return(a); } void subLm(char A[], char B[], char C) { int i = 0; while (1) { if (B[i] == C) { A[i] = '\0'; break; } else { A[i] = B[i]; i++; } } } void subRm(char A[], char B[], char C) { int i = 0, j = 0; while (B[i++] != C); do { A[j] = B[i++]; } while (A[j++]); } char captureA(char temp[]) { char row = temp[0]; for (int i = 0; temp[i] != '\0'; i++) { temp[i] = temp[i + 1]; } return(row); } TreeNode * restore(TreeNode *&T, char Pc[], char Mc[]) { int m, n, k; char temp; char mLc[MAX], mRc[MAX], pLc[MAX], pRc[MAX]; temp = captureA(Pc); subLm(mLc, Mc, temp);//執行完該函式,mLc字元陣列將獲得以temp為參考,之前的字串 subRm(mRc, Mc, temp);//mRc字元陣列將獲得temp之後的字串 m = strlength(mLc);//計算中序字串中temp左邊的字串的長度 k = strlength(mRc);//計算中序字串中temp右邊的字串的長度 n = subLp(pLc, Pc, m);//由已知的m傳遞引數,subLp的返回值是先序字串temp之後的位置+1 subRp(pRc, Pc, n);//pLc是先序字串去除temp後,第1-第m個字元,pRc是第m+1個到最後 T = new TreeNode; T->data = temp; if (m == 0) { T->Lnode = NULL; } else { restore(T->Lnode, pLc, mLc); } if (k == 0) { T->Rnode = NULL; } else { restore(T->Rnode, pRc, mRc); } return(T); }int subLp(char A[], char B[], int C) { int i = 0; for (; i < C; i++) { A[i] = B[i]; } A[i] = '\0'; return(i); } void subRp(char A[], char B[], int C) { int i = 0; do { A[i] = B[C++]; } while (A[i++]); } void formPrint(TreeNode *T) { if (T == NULL) return; formPrint(T->Lnode); formPrint(T->Rnode); printf("%c", T->data); }