【剑指offer】重建二叉树

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

分析:

1.前序遍历的第一个为根结点,在中序遍历中找到根结点的位置index

2.中序遍历中index左边的为左子树的中序遍历,假设结点个数为k,中序遍历中index的右边为右子树的中序遍历

3.前序遍历中第一个元素(根节点)后的k个元素的左子树的前序遍历,后面剩余的元素为右子树的前序遍历

class Solution
{
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in)
    {
        if(pre.size()==0||in.size()==0)
            return NULL;

        vector<int> preleft,preright;
        vector<int> inleft,inright;
        
        //
        TreeNode *root=new  TreeNode(pre[0]);
        
        //找到中序遍历中根的位置index
        int index;
        for(int i=0; i<in.size(); i++)
        {
            if(in[i]==pre[0])
            {
                index=i;
                break;
            }
        }
        
        //为左右子树确定中序遍历的元素
        int c=0;
        for(int i=0; i<in.size(); i++)
        {
            if(i<index)
                inleft.push_back(in[i]),c++;
            else if(i>index)
                inright.push_back(in[i]);
        }
        
        //为左右子树确定前序遍历的元素
        for(int i=1; i<c+1; i++)
        {
            preleft.push_back(pre[i]);
        }
        for(int i=c+1; i<pre.size(); i++)
        {
            preright.push_back(pre[i]);
        }
        
        //递归构造
        root->left=reConstructBinaryTree(preleft,inleft);
        root->right=reConstructBinaryTree(preright,inright);
        
        return root;
    }

};
原文地址:https://www.cnblogs.com/yinbiao/p/11568261.html