题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
分析:递归的方法,设计递归是难点,一开始写了好久没写对,隔天写才写对,,,注意的是:构造时TreeNode* root要按引用传递(指针的引用),或者用指针的指针,因为按指针调用时只是传递的指针即地址的值,被调用函数中形参(地址值)改变不会影像到实参。
代码:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin) {
if (pre.empty() || vin.empty())
return NULL;
//创建根节点
TreeNode* root;
//从pre[0]开始扫描
int indp = 0;
recurConstruct(vin.begin(), vin.end(), pre, vin, root, indp);
return root;
}
//注意TreeNode* &p要用引用,或者指针的指针,否则改变不了实参的
void recurConstruct(vector<int>::iterator startin, vector<int>::iterator endin, vector<int> pre, vector<int> vin, TreeNode* &p, int &indp){
if (indp>vin.size()-1||endin<startin)
return;
p=new TreeNode(pre[indp]);
vector<int>::iterator pos;
//找到当前根节点的位置
pos = find(startin, endin, pre[indp]);
indp++;
//中序遍历中,根节点左边为左子树,右边为右子树
if (pos != startin)
recurConstruct(startin, pos - 1, pre, vin, p->left, indp);
recurConstruct(pos + 1, endin, pre, vin, p->right, indp);
return;
}
};