struct BinaryTreeNode{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
BinaryTreeNode* Construct(int* preorder, int* inorder, int length) {
if(preorder == NULL || inorder == NULL || length <= 0)
return NULL;
return ConstructCore(preorder, preorder + length - 1, inorder, inorder + length - 1);
}
BinaryTreeNode* ConstructCore(int* startPreorder, int* endPreorder, int* startInoder, int* endInorder) {
//前序遍历序列的第一个数字是根结点的值
int rootValue = startPreorder[0];
BinaryTreeNode* root = new BinaryTreeNode();
root -> m_nValue = rootValue;
root -> m_pLeft = root -> m_pRight = NULL;
if(startPreorder == endPreorder) {
if(startInoder == endInorder && *startPreorder == *startInoder)
return root;
else
throw std::exception("Invalid input");
}
//在中序遍历中找到根结点的值
int* rootInorder = startInoder;
while(rootInorder <= endInorder && *rootInorder != rootValue)
++rootInorder;
if(rootInorder == endInorder && *rootInorder != rootValue)
throw std::exception("Invalid input.");
int leftLength = rootInorder - startInoder;
int* leftPreorderEnd = startPreorder + leftLength;
if(leftLength > 0) {
//构建左子树
root -> m_pLeft = ContructCore(startPreorder + 1, leftPreorderEnd, startInoder, rootInorder - 1);
//构建右子树
root -> m_pRight = ConstructCore(leftPreorderEnd + 1, endPreorder, rootInorder + 1, endInorder);
}
return root;
}
二叉树--前序序列和中序序列重构二叉树
最新推荐文章于 2021-11-18 20:03:09 发布