根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
这里是一个经典的递归算法,实现的时候需要分为左右子树生成,特别要注意的是不需要用额外的数组存放左子数和右子数的中序或后序遍历,只需要记录下标数组就行,这也是递归过程中常用的方式
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* build(vector<int>& pre, int ps,int pe, vector<int>& in,int is,int ie)
{
TreeNode *p =NULL;
if(ps<=pe)
{
p = new TreeNode(pre[ps]); // 构造函数,用前序遍历第一个元素构建一个根节点
int i;
for(i=is;i<=ie;i++)
{
if(in[i]==p->val)
break; // 找到中序遍历中根节点的位置
}
int llen = i-is; // 左子数的长度
int rlen = ie-i; // 右子数的长度
// preorder left[ps+1,ps+llen] llen为中序的长度
p->left = build(pre,ps+1,ps+llen,in,is,i-1); // preorder right[pe-rlen+1,pend]
p->right =build(pre,pe-rlen+1,pe,in,i+1,ie); // inorder left [istart,i-1]
// inorder right [i+1,iend]
}
return p;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{
int len = preorder.size();
return build(preorder,0,len-1,inorder,0,len-1);
}
};