【算法】递归+深搜:105.从前序与中序遍历序列构造二叉树

news/2024/11/8 9:06:36 标签: 算法

目录

1、题目链接

2、题目介绍

​​3、解法

函数头-----找出重复子问题

函数体---解决子问题

4、代码


1、题目链接

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


2、题目介绍


3、解法

前序遍历性质: 节点按照 [ 根节点 | 左子树 | 右子树 ] 排序。
中序遍历性质: 节点按照 [ 左子树 | 根节点 | 右子树 ] 排序。


因此,我们可以利用前序确定二叉树的根节点,中序遍历确定左、右子树的结点数。

  1. 前序遍历的首元素 为 树的根节点 node 的值。
  2. 在中序遍历中搜索根节点 node 的索引 ,可将 中序遍历 划分为 [ 左子树 | 根节点 | 右子树 ] 。
  3. 根据中序遍历中的左(右)子树的节点数量,可将 前序遍历 划分为 [ 根节点 | 左子树 | 右子树 ] 。

函数头-----找出重复子问题

重复子问题:前序构建二叉树。(根节点、左子树根节点、右子树根节点)

参数: 根节点在前序遍历的索引 root 、子树在中序遍历的左边界 left 、子树在中序遍历的右边界 right 

函数体---解决子问题

1、构建根节点、

2、找出根节点在中序遍历中对应的下标 " i "(利用哈希表进行辅助),划分左、右子树

3、构建左子树(更新参数root、left、right)

4、构建右子树(更新参数root、left、right)


 

4、代码


class Solution {

public:
    unordered_map<int, int> hash; //哈希表,便于寻找inorder中根节点的下标

    //参数: 前序,根节点对应的在前序的下标,左子树起始位置(中序),右子树结束位置(中序)
    TreeNode* dfs(const vector<int>& preorder, int root, int left, int right) {

        if (left > right)//左右子树都为空
        {
            return NULL;
        }

        //构建根节点
        TreeNode* BTroot = new TreeNode(preorder[root]);
        int inorder_root = hash[preorder[root]]; //根节点对应的在中序的下标

        //构建左右子树
        BTroot->left = dfs(preorder, root + 1, left, inorder_root - 1);
        //右子树的根节点下标(前序)= root +left_Tree_size +1 ( inorder_root - left + root +1)
        BTroot->right = dfs(preorder, inorder_root - left + root + 1, inorder_root + 1, right);

        return BTroot;
    }


    TreeNode* buildTree(const vector<int>& preorder, vector<int>& inorder) {

        //inorder填充hash
        for (int i = 0; i < inorder.size(); i++)
        {
            hash[inorder[i]] = i;
        }

        return dfs(preorder, 0, 0, inorder.size() - 1);
    }
};


http://www.niftyadmin.cn/n/5743652.html

相关文章

Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码

Python决策树、随机森林、朴素贝叶斯、KNN&#xff08;K-最近邻居&#xff09;分类分析银行拉新活动挖掘潜在贷款客户|附数据代码 最近我们被客户要求撰写关于银行拉新活动的研究报告&#xff0c;包括一些图形和统计输出。 项目背景&#xff1a;银行的主要盈利业务靠的是贷款&…

HTML5新增多媒体支持

一、引言 在当今数字化时代&#xff0c;丰富的多媒体内容对于网页的吸引力和用户体验至关重要。HTML5 的出现为网页带来了强大的多媒体支持&#xff0c;尤其是在音频和视频方面&#xff0c;为开发者和用户带来了全新的可能性。 二、音频audio标签 2.1 定义与属性详解 <a…

ATmega328P单片机

单片机是一种将中央处理器&#xff08;CPU&#xff09;、存储器、输入输出接口等集成在一块芯片上的微型计算机系统。本教程将以ATmega328P这款单片机为例&#xff0c;介绍其基本操作与编程方法。 第一部分&#xff1a;基础知识 1.1 单片机简介 单片机广泛应用于各种电子设备…

默认 iOS 设置使已锁定的 iPhone 容易受到攻击

苹果威胁研究的八个要点 苹果手机间谍软件问题日益严重 了解 Apple 苹果的设备和服务器基础模型发布 尽管人们普遍认为锁定的 iPhone 是安全的&#xff0c;但 iOS 中的默认设置可能会让用户面临严重的隐私和安全风险。 安全研究员 Lambros 通过Pen Test Partners透露&#…

卡达掐发展史

自行车是一种简单而又伟大的交通工具。自从19世纪诞生以来&#xff0c;它不仅改变了人们的出行方式&#xff0c;也深刻地影响了我们的生活方式、城市布局以及健康观念。作为一种绿色、经济的出行工具&#xff0c;自行车至今仍在全球范围内被广泛使用。本文将从自行车的历史、结…

group_concat配置影响程序出bug

在 ThinkPHP 5 中&#xff0c;想要临时修改 MySQL 数据库的 group_concat_max_len 参数&#xff0c;可以使用 原生 SQL 执行 来修改该值。你可以通过 Db 类来执行 SQL 语句&#xff0c;从而修改会话&#xff08;Session&#xff09;级别的变量。 步骤 设置 group_concat_max_l…

Fx-LMS 单片机

功能&#xff1a;主动降噪控制器 开发板连接麦克风&#xff0c;通过ADC或其他方式采集声音信号。采集到的声音信号经过开发板内置的Fx-LIIS主动降噪算法处理&#xff0c;生成反向声波信号&#xff0c;并通过DAC输出至扬声器进行播放。通过反向声波与原声波叠加&#xff0c;达到…

解决:使用EasyExcel导入Excel模板时出现数据导入不进去的问题

解决&#xff1a;使用EasyExcel导入Excel模板时出现数据导入不进去的问题 在Java中&#xff0c;当我们用EasyExcel导入Excel时&#xff0c;可能会出现数据导入不进去的问题。例如&#xff1a; 这种异常等。 问题原因1&#xff1a;这个1代表从第几行开始&#xff0c;你的exce…