题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
限制:
0 <= 节点个数 <= 5000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof
解题思路
前序遍历的第一个节点即为该二叉树的根节点,其后分别是左子树节点和右子树节点,但是前序遍历无法区分左子树和右子树的分界;中序遍历的根节点在序列中间,根节点左侧为左子树节点,后侧为右子树节点,这样结合前序遍历和中序遍历的根节点可以把原始序列分别划分为左子树和右子树序列,同样,这两段序列可以按照前面一样的方法进行节点确认,最终能重建二叉树。
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){
if(preorderSize == 0) return NULL;
int index = 0;
struct TreeNode* pnode=malloc(sizeof(struct TreeNode));
pnode->val = preorder[0];
while(index < inorderSize)
{
if(inorder[index] == preorder[0]) break;
else index++;
}
pnode->left = buildTree(preorder + 1, index, inorder, index);
pnode->right = buildTree(preorder + 1 + index, preorderSize - index - 1, inorder + index + 1, preorderSize - index - 1);
return pnode;
}