栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

力扣刷题 DAY

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

力扣刷题 DAY

Leetcode105

链接:力扣 。

题目:

根据一棵树的前序遍历与中序遍历构造二叉树。

注意: 你可以假设树中没有重复的元素。

示例1:

输入: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]

思路:

本题与上一题(后序和中序构造二叉树)大致相同。区别在于先序的第一个结点为当前树的根结点,而后序的最后一个结点为当前树的根结点。

因此采用相同的思路,先将先序的第一个结点建立成根结点,再根据数学关系将区间划分递归即可。

参考代码:

class Solution {
public:
    TreeNode* traversal (vector& inorder, vector& preorder, int left1, int right1, int left2, int right2) {
        if (left1 == right1) {
            return nullptr;
        }
        int value = preorder[left2];
        TreeNode *node = new TreeNode(value);
        int index;
        for (index = left1; index < right1; index++) {
            if (inorder[index] == value) {
                break;
            }
        }
        node->left = traversal(inorder, preorder, left1, index, left2 + 1, left2 + 1 + index - left1);
        node->right = traversal(inorder, preorder, index + 1, right1, left2 + 1 + index - left1, right2);
        return node;
    }
    TreeNode* buildTree(vector& preorder, vector& inorder) {
        if (preorder.size() == 0) {
            return nullptr;
        }
        return traversal(inorder, preorder, 0, inorder.size(), 0, preorder.size());
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779798.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号