根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
code:先序中找根,中序中划分左右子树,先序序列中元素在二叉树中的序列为根左右,所以第一个元素肯定是根节点;中序序列种元素在二叉树中的序列为左根右。
递归构建二叉树函数参数含义:先序序列,(左右子树)在先序序列中起始位置,(左右子树)在先序序列中结束位置,中序序列,(左右子树)在中序序列中起始位置,(左右子树)在中序序列中结束位置
- 左子树在先序序列中起始位置和结束位置是:preStart,preStart+左子树在中序序列中的长度
- 左子树在中序序列中起始位置和结束位置是:preStart+左子树在中序序列中的长度+1,preEnd
- 右子树在先序序列中起始位置和结束位置是:preStart,preStart+左子树在中序序列中长度+1
- 右子树在中序序列中起始位置和结束位置是:i+1,vinEnd
/** * 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 { private: TreeNode* buildTreeCore(const vector<int>& pre,int preStart,int preEnd, const vector<int>& vin,int vinStart,int vinEnd) { if(preStart>preEnd||vinStart>vinEnd) return nullptr; TreeNode* root=new TreeNode(pre[preStart]); for(int i=0;i<vin.size();++i) { if(pre[preStart]==vin[i]) { root->left=buildTreeCore(pre,preStart+1,preStart+i-vinStart,vin,vinStart,i-1); root->right=buildTreeCore(pre,preStart+i-vinStart+1,preEnd,vin,i+1,vinEnd); } } return root; } public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { if(preorder.empty()||inorder.empty()||preorder.size()!=inorder.size()) return nullptr; return buildTreeCore(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1); } };