二叉树力扣刷题(1)

126 阅读1分钟

 106.从中序与后序遍历序列构造

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

本文已参与[新人创作礼]活动,一起开启掘金创作之路

题目链接106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

思路:

1.从后序最后一个可得知是树节点,可以凭借此得出分割点

2.树节点得知后可以将中序遍历的数组分为左右两部分。

3.又因为中序树组的长度和后序数组的长度一样,又可以凭借长度将后序数组分割成左右两部分。

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

 

示例 1:

image.png

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3] 输出:[3,9,20,null,null,15,7] 示例 2:

输入:inorder = [-1],postorder = [-1] 输出:[-1] 提示:

1 <= inorder.length <= 3000 postorder.length == inorder.length -3000 <= inorder[i], postorder[i] <= 3000 inorder 和 postorder 都由 不同 的值组成 postorder 中每一个值都在 inorder 中 inorder 保证是树的中序遍历 postorder 保证是树的后序遍历

# 代码:

class Solution {
public:
    TreeNode*reversal(vector<int>& inorder, vector<int>& postorder) {
        if (inorder.size() == 0) return nullptr;
        int value = postorder[postorder.size() - 1];
        TreeNode*root = new TreeNode(value);
 
        //找出中序树组的切割点
 
        int index;                  
        for (index = 0; index <= inorder.size() - 1; index++) {
            if (inorder[index] == value) break;
        }
 
        //中序数组根据下标分为左右两部分
 
        vector<int> leftinorder(inorder.begin(), inorder.begin() + index);
        vector<int> rightinorder(inorder.begin() + index + 1, inorder.end());
        postorder.resize(postorder.size() - 1);
 
        //后序数组根据和中序数组的长度一样分为左右两部分
 
        vector<int> leftpostorder(postorder.begin(), leftinorder.size() + postorder.begin());
        vector<int> rightpostorder(postorder.begin() + leftinorder.size() ,postorder.end());
        root->left = reversal(leftinorder, leftpostorder);
        root->right = reversal(rightinorder,rightpostorder);
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if (inorder.size() == 0 || postorder.size() == 0) return nullptr;
        return reversal(inorder, postorder);
    }
};