力扣:106.从中序与后序遍历序列构造二叉树

力扣:106.从中序与后序遍历序列构造二叉树
代码随想录

题目:
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

递归思路:
通过中序和后序来构建二叉树。

先序遍历、找到中间节点,然后分为左树、右树、通过根节点递归构建。

代码随想录三步走
1:很明显满足问题的情况不明确,就按2的根、左子树、右子树。然后思考返回值就是节点。通过中序数组、后序数组来构造,可以直接用题目给定的函数形式。
2:此时很明显满足问题的情况不明确。此时就直接分为根的情况,左子树构建,右子树构建。
根的情况:根空、根为叶子
左子树构建:要知道左子树的中序数组和后序数组。
后序数组最后一个即为根,通过根来将中序数组划分为左子树、中、右子树。此时就得到了左子树的中序数组,右子树的中序数组,中序数组我们都切成了左中序数组和右中序数组了,那么后序数组就可以按照左中序数组的大小来切割,切成左后序数组和右后序数组。
通过以上就可以完成左子树的中序数组和后序数组,右子树的中序数组和后序数组。

代码:

class Solution {
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if(postorder.size() == 0) return nullptr;
        int a = postorder[postorder.size()-1];
        TreeNode* node = new TreeNode(a);
        if(postorder.size() == 1) return node;
        int i;
        for (i = 0; i < inorder.size(); ++i){
            if(inorder[i] == a) break;
        } 
        vector<int> leftinorder(inorder.begin(), inorder.begin()+i);
        vector<int> rightinorder(inorder.begin()+i+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());
        node->left = buildTree(leftinorder,leftpostorder);
        node->right = buildTree(rightinorder,rightpostorder);
        return node;
    }
};

注意这个postorder.end()代表的并不是最后一个元素,代表的是最后一个元素的后一位。
同时这个 vector 构造函数是前闭后开的

vector<int>rightpostorder(postorder.begin()+leftinorder.size(), postorder.end());

思考后序数组 (等),将后序数组分为三块:左树、右树、中。想树时也是一个节点两棵树。

后序数组:
左树 右树 中
@@@@———@@@————@
中序数组:
左树 中 右树
@@@@————@————@@@

你可能感兴趣的:(二叉树,leetcode,算法,深度优先)