1. 程式人生 > >(C語言-資料結構與演算法)還原二叉樹

(C語言-資料結構與演算法)還原二叉樹

/*根據先序和中序遍歷輸出的字串還原二叉樹,然後輸出後序遍歷*/
#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);
}