重建二叉树(剑指Offer-07)
题面
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例
例如,给出
1前序遍历 preorder = [3,9,20,15,7] 2中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3 / \ 9 20 / \ 15 7
限制
10 <= 节点个数 <= 5000
思路
经典题,给出先序中序建树。
代码
1/**
2 * Definition for a binary tree node.
3 * struct TreeNode {
4 * int val;
5 * TreeNode *left;
6 * TreeNode *right;
7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
8 * };
9 */
10class Solution {
11public:
12 TreeNode* solve(int l, int r, int rt, vector<int>& preorder, vector<int>& inorder){
13 if(l > r) return NULL;
14 int i=l;
15 while(inorder[i]!=preorder[rt]) i++;
16 TreeNode *p = new TreeNode(preorder[rt]);
17 p->left = solve(l, i-1, rt+1, preorder, inorder);
18 p->right = solve(i+1, r, rt+1+i-l, preorder, inorder);
19 return p;
20 }
21 TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
22 if(preorder.size() == 0) return NULL;
23 return solve(0, preorder.size()-1, 0, preorder, inorder);
24 }
25};