您的位置:首页 > 编程语言

重建二叉树:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

2017-05-22 14:15 507 查看
例如输入前序遍历序列{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:

    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) 

    {

        if(pre.size()==0||vin.size()==0)

            return NULL;
int root=pre[0];

        TreeNode *Node=new TreeNode(root);

        vector<int>::iterator it;

        vector<int> vinleft,vinright,preleft,preright;

        vector<int>::iterator i;

        //找出根节点在中序遍历序列中的位置,赋给i

        for(it=vin.begin();it!=vin.end();it++)

        {

            if(root==*it)

                i=it;

        }

         //根据根节点在中序遍历序列中的位置,将中序序列分为左子树右子树

        int number=0;//记录左子树的节点个数

        for(it=vin.begin();it!=vin.end();it++)

        {

            if(it<i)

             {

                 vinleft.push_back(*it);

                 number++;

             }

            if(it==i)

                continue;

            if(it>i)

                 vinright.push_back(*it);

        }

        //将前序序列分为左子树和右子树

         vector<int>::iterator itp;

        for(itp=pre.begin()+1;itp!=pre.end();itp++)

        {

            if(itp<=pre.begin()+number)//前序序列中,根节点后面number个数为左子树的结点

              preleft.push_back(*itp); 

            else

              preright.push_back(*itp); 

        }

        Node->left=reConstructBinaryTree( preleft,vinleft);

        Node->right=reConstructBinaryTree( preright,vinright);

        return Node;

    }

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程 二叉树
相关文章推荐