二叉树力扣刷题(2)105使用前序与中序遍历构造二叉树

198 阅读1分钟

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

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

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

思路:

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

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

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

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

image.png

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

输入: preorder = [-1], inorder = [-1] 输出: [-1]  

提示:

1 <= preorder.length <= 3000 inorder.length == preorder.length -3000 <= preorder[i], inorder[i] <= 3000 preorder 和 inorder 均 无重复 元素 inorder 均出现在 preorder preorder 保证 为二叉树的前序遍历序列 inorder 保证 为二叉树的中序遍历序列

class Solution {
public:
    TreeNode *reversal(vector<int> &preorder, vector<int> &inorder) {
        if (preorder.size() == 0) return nullptr;
        //如果空的话直接返回并不用执行以下条件。
        int value = preorder[0];
        TreeNode*root = new TreeNode(value);
        
        //找分割点
        
        int index;
        for (index = 0; index < inorder.size(); index++) {
            if (inorder[index] == value)break;
        }
        //中序数组根据下标分为左右两部分
        
        vector<int> leftinorder(inorder.begin(), inorder.begin() + index);
        vector<int> rightinorder(inorder.begin() + index + 1, inorder.end());
        
        //前序数组根据和中序数组的长度一样分为左右两部分
        vector<int> leftpreorder(preorder.begin() + 1, preorder.begin() + 1 + leftinorder.size());
        vector<int> rightpreorder(preorder.begin() + 1 + leftinorder.size(), preorder.end());
        root->left = reversal(leftpreorder, leftinorder);
        root->right = reversal(rightpreorder, rightinorder);
        return root;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if (preorder.size() == 0 || inorder.size() == 0) return nullptr;
        //为空直接返回了
        return reversal (preorder, inorder);
    }
};