题目:
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
思路:
就跟我们学习数据结构的时候是一样的,前序遍历的第一个数字3,一定是数的跟结点,那么在中序遍历中,数字3的左面为左子树,右面为右子树,
然后再调用递归用上面的方法建立左右子树
上代码:
class Solution
{
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{
return dfs(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);
}
TreeNode *dfs(vector<int> a,int aStart,int aEnd,vector<int> b,int bStart,int bEnd)
{
if(aStart>aEnd || bStart>bEnd)//结束条件
return NULL;
TreeNode *tree =new TreeNode(a[aStart]);
int index = 0;
while(b[bStart+index]!=a[aStart])//找到根节点在中序遍历中的索引
index++;
//建立左子树,把左子树的先序遍历数组的头尾坐标输入,对应的中序遍历收尾坐标输入
tree->left = dfs(a,aStart+1,aStart+index,b,bStart,bStart+index-1);
//建立右子树,方法同左子树
tree->right = dfs(a,aStart+index+1,aEnd,b,bStart+index+1,bEnd);
return tree;
}
};