重建二叉樹

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列
{4,7,2,1,5,3,8,6},則重建出圖所示的二叉樹並輸出它的頭結點。二叉樹結點的定義以下:
struct BinaryTreeNode
{
 int data;
 BinaryTreeNode* lchild;
 BinaryTreeNode* rchild;
};
解析:在二叉樹的前序遍歷序列中,第一個數字老是樹的根結點的值。但在中序遍歷序列中,根結點的值在序列的中間,左子樹的結點的值位於根結點的值的左邊,而右子樹的結點的值位於根結點的值的右邊。所以咱們須要掃描中序遍歷序列,才能找到根結點的值。
如圖所示,前序遍歷序列的第一個數字1就是根結點的值。掃描中序遍歷序列,就能肯定根結點的值的位置。根據中序遍歷的特色,在根結點的值1前面的3個數字都是左子樹結點的值,位於1後面的都是有右子樹結點的值。
 因爲在中序遍歷序列中,有3個數字是左子樹結點的值,所以左子樹共有3個左子結點。一樣,在前序遍歷的序列中,根結點後面的3個數字就是3個左子樹結點的值,再後面的全部數字都是右子樹結點的值。這樣咱們就在前序遍歷和中序遍歷兩個序列中,分別找到左右子樹對應的子序列。
參考代碼:
 1 BinaryTreeNode* ConstructCore(int* startPreorder,int* endPreorder,int* startInorder,int* endInorder)
 2 {
 3     //前序遍歷序列的第一個數字是根結點的值
 4     int rootValue=startPreorder[0];
 5     BinaryTreeNode* root=new BinaryTreeNode();
 6     root->data=rootValue;
 7     root->lchild=root->rchild=NULL;
 8 
 9     if(startPreorder==endPreorder)
10     {
11         if(startInorder==endInorder&&*startPreorder==*startInorder)
12             return root;
13         else
14             throw exception("Invalid input.");
15     }
16 
17     //在中序遍歷中找到根結點的值
18     int* rootInorder=startInorder;
19     while(rootInorder <= endInorder&&*rootInorder!=rootValue)
20         ++rootInorder;
21     if(rootInorder==endInorder&&*rootInorder!=rootValue)
22         throw exception("Invalid input.");
23     int leftLength=rootInorder-startInorder;//中序遍歷左子樹長度
24     int* leftPreorderEnd=startPreorder+leftLength;
25     if(leftLength>0)
26     {
27         //構建左子樹
28         root->lchild=ConstructCore(startPreorder+1,leftPreorderEnd,startInorder,rootInorder-1);
29     }
30     if(leftLength<endPreorder-startPreorder)
31     {
32         //構建右子樹
33         root->rchild=ConstructCore(leftPreorderEnd+1,endPreorder,rootInorder+1,endInorder);
34     }
35     return root;
36 }
37 
38 BinaryTreeNode* Construct(int* preorder,int* inorder,int length)//由先序和中序重建二叉樹
39 {
40     if(preorder==NULL||inorder==NULL||length<=0) return NULL;
41     return ConstructCore(preorder,preorder+length-1,inorder,inorder+length-1);
42 }
相關文章
相關標籤/搜索