重建二叉树

来源:互联网 发布:新丰县网络问政平台 编辑:程序博客网 时间:2024/06/05 03:15

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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 {private:    TreeNode* reConstructBinaryTree(const vector<int> &pre, int preFrom,                                    const vector<int> &vin, int vinFrom,                                    int len)    {        if(0 == len)        {            return 0;        }        TreeNode *root= new TreeNode(pre[preFrom]);        if(1 == len)        {                return root;        }        int rootValue= pre[preFrom];        int vinPos= -1;        for(int i= vinFrom; i< vinFrom+len; ++i)        {            if(rootValue == vin[i])            {                vinPos= i;                break;            }        }        if(-1 == vinPos)        {            return 0;        }        int leftLen= vinPos- vinFrom;        int rightLen= len- leftLen- 1;        root->left= reConstructBinaryTree(pre, preFrom+1,                                         vin, vinFrom,                                         leftLen);        root->right= reConstructBinaryTree(pre, leftLen+preFrom+1,                                         vin, vinPos+1,                                         rightLen);        return root;    }public:    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin)    {        int preLen= pre.size();        int vinLen= vin.size();        if(preLen== 0    || vinLen == 0   || preLen!= vinLen)        {            return 0;        }        return reConstructBinaryTree(pre, 0, vin, 0, preLen);    }};
原创粉丝点击