105. 从前序与中序遍历序列构造二叉树
题目描述:
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,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* buildTree(vector<int>& preorder, vector<int>& inorder) { if(preorder.size()==0||inorder.size()==0) return NULL; else return build(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1); } TreeNode* build(vector<int>& preorder, int pl,int pr,vector<int>& inorder,int il,int ir){ TreeNode* root = new TreeNode(preorder[pl]); root->left = root->right = NULL; int i=il; while(i<ir){ if(inorder[i] == preorder[pl]) break; i++; } int lsize = i - il; int rsize = ir - i; if(lsize>0) root->left = build(preorder,pl+1,pl+lsize,inorder,il,il+lsize-1); //注意中序遍历的右边界 if(rsize>0) root->right = build(preorder,pl+lsize+1,pr,inorder,il+lsize+1,ir); return root; } };