剑指Offer(4)______重建二叉树

来源:互联网 发布:听力打卡的软件 编辑:程序博客网 时间:2024/06/06 18:01

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。


class Solution {public:    bool errflag;         void clearNode(TreeNode* node){        if(node != NULL){            clearNode(node->left);            clearNode(node->right);            delete node;        }    }         TreeNode* build(vector<int>& pre,vector<int>& vin,int l1,int r1,int l2,int r2)    {        if(r1 - l1 != r2 - l2 || errflag){            errflag = true;return NULL;      //鲁棒性:  判断先序和中序长度是否不一致.        }        if(l1 > r1) return NULL;        int index = -1;        for(int i = l2 ; i <= r2 ; i ++)            if(vin[i] == pre[l1]) index = i;                 if(index == -1){            errflag = true;return NULL;      //鲁棒性:  判断是否遍历序列有错误.        }                 TreeNode* temp = new TreeNode(pre[l1]);        temp->left = build(pre,vin,l1+1,l1+index-l2,l2,index-1);        temp->right = build(pre,vin,l1+index-l2+1,r1,index+1,r2);        if(errflag){            clearNode(temp);                  //良好习惯:  发生错误就要将创建的节点回收.            return NULL;        }        return temp;    }         TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {        errflag = false;        return build(pre,vin,0,pre.size()-1,0,vin.size()-1);    }};



0 0