day18 根据一棵树的中序遍历与后序遍历构造二叉树

第一步:如果数组大小为零的话,说明是空节点了

第二步:如果不为空,那么取后序数组最后一个元素作为节点元素,找到根节点

第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点

第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)

第五步:切割后序数组,切成后序左数组和后序右数组

第六步:递归处理左区间和右区间

 

    TreeNode* traversal (vector& inorder, vector& postorder) {

        if (postorder.size() == 0) return NULL;

 

        // 后序遍历数组最后一个元素,就是当前的中间节点

        int rootValue = postorder[postorder.size() - 1];

 

        TreeNode* root = new TreeNode(rootValue);

 

        // 叶子节点

        if (postorder.size() == 1) return root;

 

        // 找到中序遍历的切割点

        int delimiterIndex;

        for (delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++) {

            if (inorder[delimiterIndex] == rootValue) break;

        }

 

        // 切割中序数组

        // 左闭右开区间:[0, delimiterIndex)

中序遍历左区间

        vector leftInorder(inorder.begin(), inorder.begin() + delimiterIndex);

        // [delimiterIndex + 1, end)

中序遍历右区间

        vector rightInorder(inorder.begin() + delimiterIndex + 1, inorder.end() );

 

        // postorder 舍弃末尾元素

        postorder.resize(postorder.size() - 1);

 

        // 切割后序数组

        // 依然左闭右开,注意这里使用了左中序数组大小作为切割点

        // [0, leftInorder.size)

后序遍历左区间

        vector leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size());

        // [leftInorder.size(), end)

后序遍历右区间

        vector rightPostorder(postorder.begin() + leftInorder.size(), postorder.end());

 

        root->left = traversal(leftInorder, leftPostorder);

        root->right = traversal(rightInorder, rightPostorder);

        return root;

    }

public:

    TreeNode* buildTree(vector& inorder, vector& postorder) {

        if (inorder.size() == 0 || postorder.size() == 0) return NULL;

        return traversal(inorder, postorder);

    }

 

 

你可能感兴趣的:(算法)