题目描述
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法1:递归
通过二叉树前序遍历,中序遍历性质可知,当前二叉树的根总在前序遍历的第一位,
通过中序遍历找到该节点的位置,在中序数组中,该节点左侧即为该节点的左子树,该节点的右侧为该节点的右子树,循环递归,则构成了一颗二叉树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class Solution { private: vector<int> preorders; vector<int> inorders; public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { this->preorders=preorder; this->inorders=inorder; int n=preorder.size(); int m=inorder.size(); if(preorder.size()==0) return NULL; return find(0,n-1,0,m-1); } TreeNode *find(int i,int ni,int j,int mj) { if(i>ni||j>mj) return NULL; int rootval=preorders[i]; int l=j; while(l<=mj&&inorders[l]!=rootval) { l++; } TreeNode *root=new TreeNode(rootval); root->left=find(i+1,i+l-j,j,l-1); root->right=find(i+l-j+1,ni,l+1,mj); return root; } };
|