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

class Solution {
public:

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

        //1.先判断遍历的二叉树是否为空,其实一般来说检查一项就行

        if((pre.size()==0)||(vin.size()==0))
            return NULL;
        TreeNode* root=new TreeNode(pre[0]);

        int i,j;

       //2.中序遍历中找到根节点的位置记录下来设为i

        for(i=0;i<vin.size()&&vin[i]!=pre[0];i++);

       //3.根据i的位置,前序遍历的左子树存于pre_left中,右子树存于pre_right,  中序遍历同样如此

        vector<int>  pre_left,pre_right,vin_left,vin_right;
        int pre_index=1;
        for(j=0;j<vin.size();j++)
        {
            if(j<i)
            {
                vin_left.push_back(vin[j]);
                pre_left.push_back(pre[pre_index]);
                pre_index++;
            }
            else if(j>i)
            {
                vin_right.push_back(vin[j]);
                pre_right.push_back(pre[pre_index]);
                pre_index++;
            }

        }

       //4.递归调用

        root->left=reConstructBinaryTree(pre_left,vin_left);
        root->right=reConstructBinaryTree(pre_right,vin_right);
        return root;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_38211852/article/details/80210618