代码随想录算法训练营DAY16|Leetcode104/111/222

leetocde101二叉树的最小深度

111. 二叉树的最小深度 - 力扣(LeetCode)

 思路:

首先要明确深度和高度的差别:

        求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。

        前序求的是深度,后序求的是高度。

        二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第二十二天的算法训练营主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小的子数组,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值