力扣hot100:543. 二叉树的直径/108. 将有序数组转换为二叉搜索树

2024-05-05 08:04

本文主要是介绍力扣hot100:543. 二叉树的直径/108. 将有序数组转换为二叉搜索树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、543. 二叉树的直径

LeetCode:543. 二叉树的直径
在这里插入图片描述

二叉树的直径 = 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度

遇到二叉树的问题很容易去直接用求解的目标去定义递归函数。但是仔细考虑,返回树的直径并不能向上传播。因此我们可以拆分成两步:

  • 树的直径 = 左儿子的高度 + 右儿子的高度 + 2

因此我们只需要求高度就行。

树求高度实际上是一个树形dpdp[root] = max(dp[child]) +1

class Solution {
public:int diameterOfBinaryTree(TreeNode* root) {max_len = 0;height(root);return max_len;}
private:int height(TreeNode * root){if(!root) return -1;//没有结点时,高度为-1。有一个结点时,高度为0int left_height = height(root->left);//左儿子高度int right_height = height(root->right);//右儿子高度max_len = max(max_len, left_height + right_height + 2);return max(left_height, right_height) + 1;//返回以root为根的子树的高度。}int max_len;
};

二、108. 将有序数组转换为二叉搜索树

LeetCode:108. 将有序数组转换为二叉搜索树
在这里插入图片描述
二叉搜索树(二叉查找树) : 对于任意节点,其左子树的所有节点的值小于该节点的值,其右子树的所有节点的值大于等于该节点的值。
这里需要注意的是,题目所给的nums 按 严格递增 顺序排列。因此,我们可以根据平衡二叉查找树的性质(左右子树高度差不大于1),通过下标直接找到根结点的位置(中间位置的结点)。

  • 当总结点个数为奇数时,中间位置的结点左右两边的结点个数相同,很显然左右子树结点个数相同,采用相同形状则高度是相同的。
  • 当总结点个数为偶数时,中间位置的结点右边的结点个数 比 左边结点个数多1。对于本中间位置结点而言,由于左右子树的生成规则相同,右子树的高度最多比左子树的高度多1。
  • 程序递归执行,因此所有结点皆满足这样的性质,则可以构建一颗平衡二叉树。

类似于:构建完全二叉查找树

class Solution {
public:TreeNode* sortedArrayToBST(vector<int>& nums) {return createTree(nums, 0, nums.size()-1);}
private:TreeNode * createTree(vector<int> & nums, int L, int R){if(L > R) return nullptr;int mid = (L + R) >> 1;TreeNode * root = new TreeNode(nums[mid], createTree(nums, L, mid - 1), createTree(nums, mid + 1, R));return root;}
};

这篇关于力扣hot100:543. 二叉树的直径/108. 将有序数组转换为二叉搜索树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/961193

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

使用Python实现图片和base64转换工具

《使用Python实现图片和base64转换工具》这篇文章主要为大家详细介绍了如何使用Python中的base64模块编写一个工具,可以实现图片和Base64编码之间的转换,感兴趣的小伙伴可以了解下... 简介使用python的base64模块来实现图片和Base64编码之间的转换。可以将图片转换为Bas

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2