由前序遍歷和中序遍歷重建二叉樹(前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5)
思路:
前序遍歷第一個是根節點。
中序遍歷根節點左側爲左子樹,根右側爲右子樹。
那麼先構造根節點,根節點左側都爲左子樹,根右側都爲右子樹。
然後對左右子樹遞歸式的構造即可。
//封裝
BinaryTreeNode* Construct(int * preorder, int* inorder,int length)
{
if(preorder == NULL || inorder == NULL || length <= 0)
return NULL;
return ConstructCore(perorder, preorder+length-1,inorder,inorder+length-1);
}
//找根並遞歸構建
BinaryTreeNode* ConstructCore(int* startPreorder,int* endPreorder,int* startInorder,int* endInorder)
{
int rootValue = startPreorder[0];
BinaryTreeNode* Root = new BinaryTreeNode();
Root -> value = rootvalue;
Root -> left = Root -> right = NULL;
if(startPreorder == endPreorder)
{
if(startInorder == endInorder && *startPreorder = *startInorder)
return Root;
else
cout<<"error input"<<endl;
return NULL;
}
//中序遍歷找根
int *rootInorder = startInorder;
while(rootInorder <= endInorder && *rootInorder != rootValue)
++rootInorder;
if(rootInorder > endInorder)
return NULL;
int leftLength = rootInorder - startInorder;
int * leftPreOrderEnd = startPreorder+leftLength;
//遞歸構建左右子樹
if(leftLength > 0)
Root -> left = ConstructCore(startPreorder+1,leftPreOrderEnd,startInorder,rootInorder-1);
if(leftLength < endPreorder - startPreorder)
Root -> right = ConstructCore(leftPreOrderEnd+1,endPreorder,rootInorder+1,endInorder-1);
return Root;
}