leetcode刷题-二叉树03

news2024/7/31 9:39:26

代码随想录二叉树part03|104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

    • 104.二叉树的最大深度
    • 111.二叉树的最小深度
    • 222.完全二叉树的节点个数

104.二叉树的最大深度

代码随想录文档讲解
LeetCode
斜体样式
本题在前一章节层序遍历时已完成。(迭代法:层序遍历)
(↓递归法:后序遍历)
首先明确二叉树的深度和高度:
深度为到根节点的距离,如节点20,深度为2;节点6,深度为3(从1开始算深度)
高度为到叶子节点的距离,如节点7,高度为1,节点20,高度为2,节点3,高度3

  	3
   /   \
  9		20
  		/	\
  	  15	 7

如何遍历呢?
高度:后序遍历(左右根),从下往上计数
深度:前序遍历(根左右),从上往下计数

二叉树的最大深度:根节点的高度

伪代码c++

int getheight(node){
	if(node==NULL) return 0;
	int leftheight = getheight(node->left);
	int rightheight = getheight(node->right);
	int height = 1+max(leftheight, rightheight);
	return height;
// 上述if后面的代码可以合并为一行
// return 1+max(getheight(node->left), getheight(node->right));
}

python代码

# 方法一
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
from collections import deque
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root: return 0
        leftheight = self.maxDepth(root.left)
        rightheight = self.maxDepth(root.right)
        return 1 + max(leftheight, rightheight)

# 方法二:之前的实现—层序遍历
from collections import deque
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        result = 0
        queue = deque([root])
        while queue:
            size = len(queue)
            result += 1
            while size:
                size -= 1
                cur = queue.popleft()
                if cur.left:
                    queue.append(cur.left)
                if cur.right:
                    queue.append(cur.right)
        return result

111.二叉树的最小深度

leetcode题目链接
代码随想录文档讲解

最小深度:根节点到最近叶子节点的深度

思路

遍历顺序三种都可以:

  1. 前序遍历求深度(根左右)
  2. 迭代法,层序遍历
  3. 但后序遍历代码更简洁,伪代码使用后序遍历

后序遍历:将孩子节点的情况返回给根节点,根节点记录

本题可能存在的陷阱(见代码)
在这里插入图片描述

伪代码(C++)

int getheight(node){
	if(node==NULL) return 0;
	int leftheight = getheight(node->left);
	int rightheight = getheight(node->right);
	// 有陷阱 如果节点左子树为空,但右子树不为空,会出现错误情况
	if(node->left == NULL && node->right != NULL){
		return 1 + rightheight;
	}
	if(node->left != NULL && node->right == NULL){
		return 1 + leftheight;
	}
	int result = 1 + min(leftheight, rightheight);
	return result;
}

python代码

# 后序遍历
from collections import deque
class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        leftheight = self.minDepth(root.left)
        rightheight = self.minDepth(root.right)

        if root.left and not root.right:
            return 1 + leftheight
        if not root.left and root.right:
            return 1 + rightheight
        result = 1 + min(leftheight, rightheight)
        return result
        
# 层序遍历
from collections import deque
class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        res = 1
        q = deque([root])
        while q:
            size = len(q)
            while size:
                cur = q.popleft()
                if cur.left:
                    q.append(cur.left)
                if cur.right:
                    q.append(cur.right)
                if not cur.left and not cur.right:
                    return res
                size -= 1
            res += 1

222.完全二叉树的节点个数

leetcode题目链接
代码随想录文档讲解

思路

如果当成普通二叉树,前中后序都可以求得二叉树的节点个数,层序遍历的迭代法也可以。

伪代码(C++)

int getNum(node){
	if(node==NULL) return 0;
	leftnum = getNum(node->left);        //左
	rightnum =  getNum(node->right);  //右
	result = 1 + leftnum + rightnum;      //中
}

若使用完全二叉树的特性:
除了底层节点,上面的节点都是满的,底层节点从左到右是满的。
满二叉树节点数量的计算公式: 2 n − 1 2^n-1 2n1
在这里插入图片描述
如何去判断子树是满二叉树呢?
如果是满二叉树的话 ,向左遍历的深度和向右遍历的深度是相等的。
如果不是满二叉树,继续向下遍历,子树可能是满二叉树。

子树如果为满二叉树可以根据公式计算节点数量,然后返回给根节点。

伪代码(C++)

本题的终止条件:

  1. 节点为空
  2. 子树为满二叉树
int getNum(node){
	if(node == NULL) return 0;
	left = node->left;
	right = node->right;
	leftdeepth = 0;
	rightdepth = 0;
	while(left)[
		left = left->left;
		leftdepth++;
	}
	while(right){
		right = right->right;
		rightdepth++;
	}
	if(leftdepth == rightdeepth) return 2<<leftdepth - 1; // 位运算 
	// 2 左移一位: 2<<1,相当于2的2次方:4

	leftnum = getNum(node->left);
	rightnum =  getNum(node->right);
	result = 1 + leftnum + rightnum;
	return result;
}

python代码

# 普通二叉树
class Solution:
    def countNodes(self, root: Optional[TreeNode]) -> int:
        if not root: return 0
        return 1 + self.countNodes(root.left) + self.countNodes(root.right)
  
# 完全二叉树
class Solution:
    def countNodes(self, root: Optional[TreeNode]) -> int:
        if not root: return 0
        leftdepth = 0
        rightdepth = 0
        left = root.left
        right = root.right
        while left:
            leftdepth += 1
            left = left.left
        while right:
            rightdepth += 1
            right = right.right
        if leftdepth == rightdepth:
            return (2<<leftdepth) - 1
            # return 2 ** (leftdepth+1) - 1
        return 1 + self.countNodes(root.left) + self.countNodes(root.right)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1815091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

短视频矩阵筷子科技、抖去推、超级编导有那几家源头开发是自己底层框架做的-----

目前这几家都是自己技术团队搭建开发的&#xff0c;每家都有优势劣势产品上基本都已经成熟趋向于优化技术阶段。 云罗---抖去推&#xff1a;*** 将在CAP原则基础上使用分布式架构,对此网站的整体架构采用了基于B/S三层架构模式,将数据层、业务应用层、表现层分开。BS架构B/S&a…

第二届黄河流域团队赛个人wp

个人wp web 两个题都几乎是网上的原题&#xff0c;不想多说了&#xff0c;放个链接&#xff0c;重点记录一下自己第一次遇到的misc 冰蝎流量分析 web1 https://blog.csdn.net/qq_51768842/article/details/125153850 web2 https://blog.csdn.net/m0_73512445/article/detai…

北京医院共享轮椅小程序开发更贴心,更便捷

在大数据不断发展的今天&#xff0c;资源共享已随处可见&#xff0c;小到共享充电宝&#xff0c;共享雨伞&#xff0c;大到共享单车&#xff0c;汽车。这些常用资源的共享&#xff0c;充分实现了有限资源的最大化利用。 如今&#xff0c;众多北京医院&#xff0c;也结合自身实…

TQZC706开发板教程:10G光口arp测试

网盘分享&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1H-_hn1eAi-Byzn-4tcSFKA 提取码&#xff1a;q524 使用前需要设置时钟&#xff0c;调整右下角的拨码开关为↑↓↓↑↑ 从原理图中可以看出设置为156.25MHz&#xff0c;10Gige模式 启动模式设置为JTAG模式&#…

内地人真的被香港的工资震惊到了!香港身份真的很香

在我优才获批以前&#xff0c;我工资也就一两万&#xff0c;工作压力大又很焦虑&#xff0c;后来在一次和朋友吃饭上聊到了香港工资的话题&#xff0c;说这边的待遇水平比较高。&#x1f60e;&#x1f60e; . 那时候不相信&#xff0c;问了一些在香港工作的大学同学&#xff0c…

【机器学习基础】Python编程07:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

颠覆与创新:探寻Facebook未来的发展路径

Facebook&#xff0c;这个曾经引领社交网络革命的巨头&#xff0c;在如今竞争激烈的科技市场中&#xff0c;正面临着前所未有的挑战和机遇。如何在不断变化的数字世界中保持竞争力&#xff0c;成为业界领先者&#xff0c;这是摆在Facebook面前的重要课题。本文将探寻Facebook未…

如何快速搭建自己的进销存系统?

什么是进销存系统&#xff1f; 进销存&#xff0c;是指企业管理过程中采购&#xff08;进&#xff09;—入库&#xff08;存&#xff09;—销售&#xff08;销&#xff09;的动态管理过程。进&#xff1a;指询价、采购到入库与付款的过程。进销存管理系统是对企业生产经营中物…

一分钟学习数据安全—自主管理身份SSI可验证凭证

在对SSI的概念、组成、架构以及用到的加密技术有了大概的了解之后&#xff0c;我们进入到SSI架构的核心&#xff1a;可验证凭证。 可验证凭证旨在实现以下两个目的&#xff1a; 提供数字钱包中的证书的数字版本。用一组关于标识符的声明“自上而下”证明身份&#xff0c;而非“…

Pycharm远程连接服务器配置

创建虚拟环境 conda create -n envName python指定python版本删除虚拟环境 conda remove -n envName --all查看所有虚拟环境 conda env list使用or激活虚拟环境 conda activate HINormer如何查看python编译器是在哪个虚拟环境中&#xff1a; 使用我们尊贵的2080Ti在安装配…

详解 Flink Table API 和 Flink SQL 之流处理中的表

一、关系型表和流处理表对比 关系型表/SQL流处理表处理的数据对象字段元组的有界集合字段元组的无限序列查询&#xff08;Query&#xff09;对数据的访问可以访问到完整的数据输入无法访问所有数据&#xff0c;必须持续“等待”流式输入查询终止条件生成固定大小的结果集后终止…

SyntaxError: Non-UTF-8 code starting with ‘\xbd‘ in file错误解决

在运用python的pandas和numpy的内容环境下&#xff0c;运行代码时发生以下错误&#xff1a; C:\ProgramData\Anaconda3\python.exe D:/zafile/py数据分析与应用/数据分析代码/14.2、紧急电话数据分析.pyFile "D:/zafile/py数据分析与应用/数据分析代码/14.2、紧急电话数据…

教你一招,告警恢复时如何拿到恢复时的值?

Prometheus 生态的原生做法&#xff0c;由于阈值是放在 promql 中的&#xff0c;恢复时的消息中难以拿到恢复时的值&#xff0c;夜莺 v7.0.0.beta10 版本开始&#xff0c;提供了一种较为简单的内置方式&#xff0c;解决这个问题。下面我们就来看一下如何实现这个能力。 升级方…

MATLAB画图时添加标注显示有效数字的位数,可以编辑此函数

本来系统有个函数&#xff0c;在图像窗口选择标注工具&#xff0c;再在图像窗口右击鼠标&#xff0c;选择"编辑文本更新函数..."&#xff0c;即打开系统的设置函数&#xff0c;可以修改最后一行&#xff1a; formattedValue [valueFormat num2str(value,4) removeV…

Python私教张大鹏 Vue3整合AntDesignVue之AutoComplete 自动完成

何时使用 需要一个输入框而不是选择器。需要输入建议/辅助提示。 和 Select 的区别 AutoComplete 是一个带提示的文本输入框&#xff0c;用户可以自由输入&#xff0c;关键词是辅助输入。Select 是在限定的可选项中进行选择&#xff0c;关键词是选择。 基本使用 基本使用。…

创新突破!科海思荣获高效含铊废水处理专利

随着科技进步和工业发展&#xff0c;环境保护和资源循环利用日益受到全球关注。面对严峻的环境挑战&#xff0c;科技创新成为推动可持续发展的关键动力。近日&#xff0c;科海思&#xff08;北京&#xff09;科技有限公司凭借其深厚的技术积累和持续的创新精神&#xff0c;成功…

RT-Thread系统使用STM32H7芯片串口5不工作

使用stm32h743芯片串口5不工作&#xff0c;其他串口都正常&#xff0c;TX5->PC12,RX5->PD2 drv_usart.c里面串口5的TX和RX反了&#xff0c;将TX和RX对调后解决。

SAP 生产订单工序创建BAPI外协加工字段增强CO_SE_PRODORD_OPR_CREATE

需求&#xff1a; 使用BAPI对工单进行新增工序时&#xff0c;需要同时维护外协加工页签上的部分字段&#xff0c;但是该BAPI不包含其中的一些字段&#xff0c;故对此BAPI进行增强以实现该效果。 实现方式&#xff1a; 1.老规矩&#xff0c;COPY标准BAPI出来&#xff0c;再对其…

微信小游戏开发流程及上架步骤:微信小游戏定制开发源码搭建

微信小游戏开发方案主要包括以下几个方面&#xff1a; 1.游戏设计&#xff1a;根据需求和目标用户群体&#xff0c;设计游戏玩法、关卡、角色、场景等元素&#xff0c;确保游戏具有吸引力和可玩性。 2.技术实现&#xff1a;根据游戏设计&#xff0c;选择合适的技术栈和开发工具…

平时的财经日历会影响黄金现货走势吗?

现货黄金的价格走势会受到诸多因素的影响&#xff0c;比如在财经日历上&#xff0c;美国的非农就业报告、GDP、利率公告、通胀数据等新闻和经济公告&#xff0c;都可能会对市场产生重大影响&#xff0c;尤其是当这些数据与市场预期不符的时候。所以比起单纯地进行技术分析和图表…