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

来源:互联网 发布:mysql 数据文件 编辑:程序博客网 时间:2024/06/01 10:25

例如输入前序遍历序列{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;
    }
};

阅读全文
1 0
原创粉丝点击