题目描述:
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 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) {} * }; */ /* 算法思想: 1.根据前序排列第一个数字确定根节点,并在中序排列中确定根节点位置。 2.根据根节点的位置确定中序排列中左子树、右子树,中序排列中根节点之前的数字为左子树,根节点之后的部分为右子树 。 3.根据中序排列中左子树和右子树的长度确定在前序排列中的左子树、右子树。 4.将左子树构建为一个容器,右子树构建为一个容器。递归构建左子树、右子树,直到叶子节点(判断条件为左右子树分别没有子树)。 */ class Solution { public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { TreeNode* root=NULL; vector<int>preL,preR,inL,inR; //将前序和后序的左子树、右子树分别构建为一个容器,用于存放。 int i; int rootIndex=0; //根节点的位置 if(preorder.empty()!=1||inorder.empty()!=1){ //若不是叶子结点,则第一个元素为根节点 root=new TreeNode(preorder[0]); //在前序序列中找到根节点 for(i=0;i<inorder.size();++i){ //在中序序列中找到根节点 if(inorder[i]==preorder[0]) break; rootIndex++; } for(i=0;i<rootIndex;++i){ //左子树的前序、中序序列 preL.push_back(preorder[i+1]); //第一个 inL.push_back(inorder[i]); } for(i=rootIndex+1;i<inorder.size();++i){ //右子树的前序、中序序列 preR.push_back(preorder[i]); //第一个 inR.push_back(inorder[i]); } root->left=buildTree(preL,inL); //递归构建左子树、右子树 root->right=buildTree(preR,inR); } return root; } };