思路:二叉樹的先根序列和中根序列,用兩個數組preorder和inorder存放,先根序列的第一個元素值preorder[0]應為二叉樹的根上的元素值,在另一個數組中查到此值,設為inorder[k]。此時,數組preorder中從preorder[1]到preorder[k]的序列(長度為k)和數組inorder中從inorder[0]到inorder[k-1](長度為k)的序列,恰好分別是根結點左子樹的先根序列和中根序列;數組preorder中從preorder[k+1]到preorder[n-1]的序列(長度為n-k-1)和數組inorder中從inorder[k+1]到inorder[n-1](長度為n-k-1)的序列,恰好分別是根結點右子樹的先根序列和中根序列。根據上述分析,先創建根結點,在遞歸調用自己兩次來分別創建左右子樹。
時間復雜度:最壞的情況是,每個非葉結點只有左子樹,這是兩個數組之間需要比較n+(n-1)+---+1=O(n2)次。所以,該算法時間代價為O(n2)。
空間復雜度:存放二叉樹的空間O(n)和用於遞歸調用的棧空間(不超過O(n))。
程序代碼:
int create_BTree(PBinTree pbtree,DataType * preorder,DataType * InOrder,int n)
{
int i,k;
int tag1,tag2;
if(n == 0)
{
*pbtree = NULL;
return TRUE;
}
for(i = 0;i<n;i++)
if(inorder[i] == preorder[0])
break;
if(i == n)
{
*pbtree = NULL;
return FALSE; //輸入的先根序列或中根序列有誤,創建失敗
}
k = i;
*pbtree = (PBinTreeNode)malloc(sizeof(struct BinTreeNode));
(*pbtree)->info = preorder[0];
tag1 = create_BTree(&(*pbtree)->llink,preorder+1,inorder,k); //遞歸調用本算法創建左子樹
tag2 = create_BTree(&(*pbtree)->rlink,preorder+k+1,inorder+k+1,n-k-1); //遞歸調用本算法創建右子樹
if(tag1 == TRUE && tag2 == TRUE)
return TRUE;
return FALSE;
}