输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回的二叉树:[3,9,20,null,null,15,7]
限制:
0 <= 节点个数 <= 5000
我的思路
- 递归返回二叉树每一个子树的根节点,例如前序遍历中[3,9,20,15,7]里3为根节点,放在需要返回的链表最前面。
- 那么此时中序遍历中所有在3左边的数据为左子树,利用lp,li存放左子树的前序遍历和中序遍历的结果。
- 递归调用函数返回根节点的左孩子节点,若是没有数据,则返回NULL
- 同理在3右边边的数据为右子树,利用rp,ri存放左子树的前序遍历和中序遍历的结果。
- 递归调用函数返回根节点的右孩子节点,若是没有数据,则返回NULL
- 那么此时中序遍历中所有在3左边的数据为左子树,利用lp,li存放左子树的前序遍历和中序遍历的结果。
代码如下
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.empty())return NULL;
TreeNode* tr = new TreeNode(preorder[0]);
vector<int>lp,li,rp,ri;
int k;
for(k=0;inorder[k]!=preorder[0];k++)
{
lp.push_back(preorder[k+1]);
li.push_back(inorder[k]);
}
tr->left = buildTree(lp,li);
for(k=k+1;k<inorder.size();k++)
{
rp.push_back(preorder[k]);
ri.push_back(inorder[k]);
}
tr->right= buildTree(rp,ri);
return tr;
}