leetocde101二叉树的最小深度
思路:
首先要明确深度和高度的差别:
求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。
前序求的是深度,后序求的是高度。
二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始)
求高度应该是后序遍历
求深度应该是前序遍历
这里有一个陷阱如图所示:
(来自代码随想录)
这里是不是有人认为最小深度就是1了?
重新审一下题目!!!题目明确的说了这里的
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
所以我们这里左子树为空的时候我们就要去遍历右子树直到最近的一个叶子节点,从根节点到它的深度才是最小深度!
所以我们的判断逻辑:如果root.left==none and root.right!=none:
return 1+rightheight
如果左边不为空右边为空呢?是一样的逻辑哦~
代码:
#
# @lc app=leetcode.cn id=111 lang=python3
#
# [111] 二叉树的最小深度
#
# https://leetcode.cn/problems/minimum-depth-of-binary-tree/description/
#
# algorithms
# Easy (51.09%)
# Likes: 865
# Dislikes: 0
# Total Accepted: 473.1K
# Total Submissions: 924.4K
# Testcase Example: '[3,9,20,null,null,15,7]'
#
# 给定一个二叉树,找出其最小深度。
#
# 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
#
# 说明:叶子节点是指没有子节点的节点。
#
#
#
# 示例 1:
#
#
# 输入:root = [3,9,20,null,null,15,7]
# 输出:2
#
#
# 示例 2:
#
#
# 输入:root = [2,null,3,null,4,null,5,null,6]
# 输出:5
#
#
#
#
# 提示:
#
#
# 树中节点数的范围在 [0, 10^5] 内
# -1000
#
#
#
# @lc code=start
# 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
class Solution:
def minDepth(self, root: Optional[TreeNode]) -> int:
return self.get_min(root)
def get_min(self,root):
if not root:
return 0
leftheight = self.get_min(root.left)
rightheight = self.get_min(root.right)
if root.left==None and root.right!=None:
return 1+rightheight
if root.left!=None and root.right==None:
return 1+leftheight
return 1+min(leftheight,rightheight)
leetcode104二叉树的最大深度
和上面题目有啥区别?
注意审题:二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
和上面的区别就是 我们不需要去处理他的左右孩子
只需要比较当前他们子树的高度然后+1
所以
直接上代码了:
#
# @lc app=leetcode.cn id=104 lang=python3
#
# [104] 二叉树的最大深度
#
# https://leetcode.cn/problems/maximum-depth-of-binary-tree/description/
#
# algorithms
# Easy (77.11%)
# Likes: 1417
# Dislikes: 0
# Total Accepted: 874.2K
# Total Submissions: 1.1M
# Testcase Example: '[3,9,20,null,null,15,7]'
#
# 给定一个二叉树,找出其最大深度。
#
# 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
#
# 说明: 叶子节点是指没有子节点的节点。
#
# 示例:
# 给定二叉树 [3,9,20,null,null,15,7],
#
# 3
# / \
# 9 20
# / \
# 15 7
#
# 返回它的最大深度 3 。
#
#
# @lc code=start
# 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
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
"""二叉数的最大深度 其实就是二叉树的高度"""
return self.get_height(root)
def get_height(self,root):
if not root:
return 0
leftheight = self.get_height(root.left)
rightheight = self.get_height(root.right)
max_height = 1+ max(leftheight,rightheight)
return max_height
首先关键核心在于 二叉树的最大深度 其实就是这个二叉树的高度
所以可以采用前序(根左右)和后续(左右根)的思路
"""
# @lc code=end
Leetcode222完全二叉树的节点数量
说实话写了这么多二叉树的题大家有没有发现我用的都是递归,压根就没有用过迭代。。。
因为。。。。我不会迭代。。。。。
递归真的很香哈哈哈哈
思路:
首先知道什么是完全二叉树:
(来自代码随想录)
完全二叉树和满二叉树有什么区别:
对于满二叉树,除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。
定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。
定义:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
那么在这里:完全二叉树有几种情况?
答案是2种,第一:这棵树就是满二叉树,第二:最后一层的叶子节点没有满。
如果是满二叉树,计算他的节点数量就可以直接套公式:2^k-1(K是树的深度)
如果是第二种情况呢:分别递归左孩子和右孩子,递归到某一深度一定会有左孩子或者右孩子是满二叉树,然后按照情况1来计算。
(来自代码随想录)
其次:判断是不是满二叉树==判断左右子树的深度是否相等
特例:
(代码随想录)
这种就不是满二叉树,因为第二层并没有满,并且也不是一个完全二叉树。
代码:
class Solution:
def countNodes(self, root: Optional[TreeNode]) -> int:
return self.count(root)
def count(self,root):
depth = 0
if not root:
return depth
left_num = self.count(root.left)
right_num = self.count(root.right)
totalsum = left_num + right_num + 1
return totalsum