【剑指offer】面试题6:重建二叉树

来源:互联网 发布:有关大数据的例子 编辑:程序博客网 时间:2024/04/30 14:51

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) {        int len1 = pre.size();        int len2 = in.size();        if(len1!=len2||len1==0){            return NULL;        }        return ConstructCore(pre,in,0,len1-1,0,len2-1);    }private:    struct TreeNode* ConstructCore(vector<int>& pre,vector<int>& in,int startPreorder, int endPreorder, int startInorder, int endInorder){        int rootValue = pre[startPreorder];        TreeNode* proot = new TreeNode(rootValue);        if(startInorder==endInorder){            if(startInorder==endInorder&&pre[startPreorder]==in[startInorder])                 return proot;            else return NULL;        }                    int rootInorder = startInorder;        while(rootInorder<endInorder&&in[rootInorder]!=rootValue)            rootInorder++;        if(rootInorder==endInorder&&in[rootInorder]!=rootValue)            return NULL;        int leftLength = rootInorder - startInorder;        int leftPreorderEnd = startPreorder + leftLength;        if(leftLength>0){            proot->left = ConstructCore(pre,in,startPreorder+1,leftPreorderEnd,startInorder,rootInorder-1);        }        if(leftLength<endPreorder-startPreorder){            proot->right = ConstructCore(pre,in,leftPreorderEnd+1,endPreorder,rootInorder+1,endInorder);        }        return proot;            }     };


0 0
原创粉丝点击