当前位置: 首页 > article >正文

12.04 二叉树中等题

513. 找树左下角的值

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

示例 1:

输入: root = [2,1,3]
输出: 1

思路:找到最低层中最左侧的节点值,比较适合层序遍历,返回最低层的第一个值即可。

细节:判断是否是最低层,需要保存节点的当前层数。可以用queue<pair>来保存pair保存<节点指针,层数>

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        if(!root) return -1;
        queue<pair<TreeNode*,int>> q;
        q.push({root,1});
        int deepthMax=1;
        int ret=root->val;
        while(!q.empty())
        {
            pair<TreeNode*,int> pariFront=q.front();
            TreeNode* nodeFront=pariFront.first;
            int deepth=pariFront.second;
            //判断是否是更低的一层
            if(deepth>deepthMax)
            {
                deepthMax=deepth;
                ret=nodeFront->val;
            }
            q.pop();
            if(nodeFront->left) q.push({nodeFront->left,deepth+1});
            if(nodeFront->right) q.push({nodeFront->right,deepth+1});
        }
        return ret;
    }
};
  • 时间复杂度:O(n),其中 nnn 是二叉树的节点数目。



654. 最大二叉树

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 递归地在最大值 左边 的 子数组前缀上 构建左子树。
  3. 递归地在最大值 右边 的 子数组后缀上 构建右子树。

返回 nums 构建的 最大二叉树 

示例 1:

输入:nums = [3,2,1,6,0,5]
输出:[6,3,5,null,2,0,null,null,1]
解释:递归调用如下所示:
- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。
    - [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。
        - 空数组,无子节点。
        - [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1] 。
            - 空数组,无子节点。
            - 只有一个元素,所以子节点是一个值为 1 的节点。
    - [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 [] 。
        - 只有一个元素,所以子节点是一个值为 0 的节点。
        - 空数组,无子节点。

 思路:最简单的方法是直接按照题目描述进行模拟。

左子树为 construct(nums,left,best−1)

右子树为 construct(nums,best+1,right)

当递归到一个空数组时,便可以返回一棵空的树。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int findMaxIndex(vector<int>& nums)
    {
        int ret=0;
        for(int i=1;i<nums.size();i++)
        {
            if(nums[i]>nums[ret]) ret=i;
        }
        return ret;
    }
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        if(nums.empty()) return nullptr;
        int maxIndex=findMaxIndex(nums);

        vector<int> leftNums(nums.begin(),nums.begin()+maxIndex);
        vector<int> rightNums(nums.begin()+maxIndex+1,nums.end());


        TreeNode* root=new TreeNode(nums[maxIndex],
        constructMaximumBinaryTree(leftNums), //左子树
        constructMaximumBinaryTree(rightNums)); //右子树
        return root;
    }
};

时间复杂度:O(n^2),其中 nnn 是数组 nums\textit{nums}nums 的长度。在最坏的情况下,数组严格递增或递减,需要递归 n 层,第 i (0≤i<n)层需要遍历 n−i个元素以找出最大值,总时间复杂度为 O(n2)

思路2:利用单调栈可以实现时间复杂度O(n)

代码随想录


http://www.kler.cn/news/157011.html

相关文章:

  • Vue3组合式API
  • DevEco Studio将常用内容设为代码模板 通过快捷键调出
  • 网工学习8-配置 STP 协议(一)
  • 【陈老板赠书活动 - 19期】-2023年以就业为目的学习Java还有必要吗?
  • 【数组】-Lc27-移除元素(相向双指针)
  • android studio 打开flutter项目 出现 dart sdk is not configured
  • navicat premium 历史版本下载地址
  • AI代码助手:写代码“如虎添翼”
  • 自动化集成有哪些典型应用场景?
  • 【程序员的养生指南--散文篇】
  • 毕业项目分享
  • LabVIEW开发工业设备远程在线状态监测
  • 如何有效进行测试执行进度计划
  • 力扣374周赛
  • 前端开发学习 (四) 自定义按键修饰符
  • Redis5新特性-stream
  • 鸿蒙开发笔记
  • fbprophet 安装流程
  • 探索人工智能领域——每日20个名词详解【day7】
  • Win10安装ROS2遇到的小问题
  • centos7 设置静态ip
  • Java项目学生管理系统四编辑学生
  • 蓝桥杯物联网竞赛_STM32L071KBU6_全部工程及源码
  • 数据结构 | 查漏补缺之求叶子结点,分离链接法、最小生成树、DFS、BFS
  • 大于2T磁盘划分并挂接
  • webGL开发学科演示项目方案
  • Leetcode 80 删除排序数组中的重复项 II
  • WebSocket入门介绍及编程实战
  • 【23-24 秋学期】NNDL 作业11 LSTM
  • 使用com组件编辑word