2021.2.9 刷题(构造二叉树)

1.从中序与后序遍历序列构造二叉树
题目链接:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
题目描述:
2021.2.9 刷题(构造二叉树)

题解:
2021.2.9 刷题(构造二叉树)
第一步:如果数组大小为零的话,说明是空节点了。
第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。
第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点
第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)
第五步:切割后序数组,切成后序左数组和后序右数组
第六步:递归处理左区间和右区间


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* travel(vector<int>& inorder, vector<int>& postorder)
    {
        if(postorder.size() == 0) return nullptr;
        int val = postorder[postorder.size() - 1]; //二叉树的根
        TreeNode* root = new TreeNode(val);//创建一个新节点
        int index;
        for(index = 0; index < inorder.size(); index++)  //在中序数组中找到后续节点的分割位置
        {
            if(inorder[index] == val) break;
        }
        //切割中序数组,中序左数组[0, index)
        vector<int> leftInorder(inorder.begin(), inorder.begin() + index);
        //切割中序数组,中序右数组[index + 1, end)
        vector<int> rightInorder(inorder.begin() + index + 1, inorder.end());
        postorder.resize(postorder.size() - 1);//去除后序数组的最后一个元素
        //切割后序数组,后序左数组于中序左数组大小一致
        vector<int> leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size());
        vector<int> rightPostorder(postorder.begin() + leftInorder.size(), postorder.end());
        //递归处理左右子树
        root->left = travel(leftInorder, leftPostorder);
        root->right = travel(rightInorder, rightPostorder);
        return root;

    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if(inorder.size() == 0 || postorder.size() == 0)
            return nullptr;
        return travel(inorder, postorder);

    }
};

上一篇:106. 从中序与后序遍历序列构造二叉树


下一篇:剑指 Offer 33. 二叉搜索树的后序遍历序列