​LeetCode解法汇总105. 从前序与中序遍历序列构造二叉树

news/2024/7/5 3:14:44

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台


描述:

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

示例 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]

提示:

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

解题思路:

1.我们可以通过前序遍历和中序遍历发现一个规律,前序遍历的第一个数字,一定是根结点。然后中序遍历中找到这个根节点,就可以分成左右两份,分别对应左子树和右子树。
2.比如前序遍历是[1,2,3,4],中序遍历是[3,2,1,4],那么1就是根节点,[3,2]就位于根节点的左子树上,[4]位于根节点的右子树上。此时我们就可以构建一个1的节点。
3.我们继续对[4]的部分继续采取上面的分割流程,就可以生成一个4的节点,此时无法继续分割。继续对[2,3]的部分进行分割,则可以生成一个2的节点,然后继续分割。
4.所以,我们可以采取递归的策略,不断的分割,每次分割取出其前序和中序遍历的部分进行下一轮的遍历,直到长度为1,并添加到其左右节点上。就可以得到我们想要的结果。

代码:

class Solution {
public:
   TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder)
    {
        TreeNode *node = buildNode(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
        return node;
    }

    TreeNode *buildNode(vector<int> &preorder, vector<int> &inorder, int preStart, int preEnd, int inStart, int inEnd)
    {
        int expectValue = preorder[preStart];
        // inorder.at(expectValue);
        auto it = find(inorder.begin(), inorder.end(), expectValue);
        int index = std::distance(inorder.begin(), it);
        int leftLength = index - inStart;
        int rightLength = inEnd - index;
        TreeNode *root = new TreeNode(expectValue);
        if (leftLength >= 1)
        {
            root->left = buildNode(preorder, inorder, preStart + 1, preStart + leftLength, inStart, index - 1);
        }
        if (rightLength >= 1)
        {
            root->right = buildNode(preorder, inorder, preEnd - rightLength + 1, preEnd, index + 1, inEnd);
        }
        return root;
    }
};


http://lihuaxi.xjx100.cn/news/2040031.html

相关文章

bin文件夹和命令行解释器cmd 的简单认识

在许多软件安装过程中&#xff0c;宝宝们可能会看到一个名为"bin"的文件夹。"bin"是二进制&#xff08;binary&#xff09;的缩写&#xff0c;通常用于存放可执行文件&#xff08;executable files&#xff09;或二进制文件。它的主要作用是存储程序的实际…

《Linux C编程实战》笔记:消息队列

消息队列是一个存放在内核中的消息链表&#xff0c;每个消息队列由消息队列标识符标识。与管道不同的是消息队列存放在内核中&#xff0c;只有在内核重启&#xff08;即操作系统重启&#xff09;或显示地删除一个消息队列时&#xff0c;该消息队列才会被真正的删除。 操作消息…

JQuery简介与解析

jQuery是一个快速、小巧、功能丰富的JavaScript库&#xff0c;它简化了HTML文档遍历、事件处理、动画和Ajax等操作。自从2006年由John Resig创建以来&#xff0c;jQuery已经成为Web开发中最受欢迎的JavaScript库之一。以下是对jQuery的简介和一些关键特性的解析&#xff0c;以及…

2.20 day2 QT

自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//窗口相关设置this->setWindowTitle("登入页面"); //设置 窗口 标题this->setWindowIcon(QIcon("D:…

哈希表——布隆过滤器

哈希表——布隆过滤器 一个问题应用方面布隆过滤器实现 我们今天继续来了解哈希表的延伸——布隆过滤器。 一个问题 我们之前介绍过了位图&#xff0c;我们将数据进行映射到相应的二进制位上。来帮助我们提高检索的效率。但是我们生活中可不是简简单单存个数字就行了。如果我…

Selenium基于Python web自动化测试框架 -- PO

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

JWT从入门到上天系列第一章:JWT的简介和传统认证流程的对比

&#x1f609;&#x1f609; 欢迎加入我们的学习交流群呀&#xff01; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring、Security、Docker、Grpc、消息中间件、Rpc、SpringCloud等等很多应用和源码级…

『C语言初阶』第四章-指针(3)

1.字符指针变量 在指针的类型中我们知道有一种指针类型为字符指针char*; 一般使用&#xff1a; int main() {char ch w;char* pc &ch;*pc w;return 0; } 还有一种使用方式&#xff1a; int main() {const char* pstr "hello bit.";//这里是吧一个字…