输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
思路:
先从中序序列中找出根节点所在的位置,然后该位置左边的是根节点的左子树,根节点右边的序列是根节点的右子树。
//在中序序列中寻找根节点的位置
int findpos(int* inorder, int inorderSize, int value)
{
int pos = -1;
for (int i = 0; i < inorderSize; i++)
{
if (inorder[i] == value)
{
pos = i;//找到了根节点的位置
break;
}
}
return pos;
}
struct TreeNode* Create(int* preorder, int* inorder, int len)
{
struct TreeNode* root = NULL;
if (len > 0)
{
root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
//根节点就是线序遍历序列的第一个元素
root->val = preorder[0];
int pos = findpos(inorder, len, preorder[0]);
if (pos == -1)
{
//如若没有找到根节点,二叉树构建失败
return NULL;
}
//左子树是所找到的根节点的左边序列元素
root->left = Create(preorder + 1, inorder, pos);
//右子树是右边序列的元素
root->right = Create(preorder + pos + 1, inorder + pos + 1, len - 1 - pos);
}
return root;
}
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize)
{
//两个序列里面没有元素或者两个序列中元素个数不相等时不能构建一个二叉树
if (preorderSize == 0 || inorderSize == 0 || preorderSize != inorderSize)
{
return NULL;
}
//开始构建二叉树
struct TreeNode* s = Create(preorder, inorder, preorderSize);
return s;
}
对于如何通过二叉树的中序遍历和线序遍历(或者后序遍历和中序遍历)构建一颗二叉树,见此篇博客,有详细图解。
https://blog.youkuaiyun.com/csdn_edition/article/details/109922134