Python - 代码随想录算法训练营第十七天 | LeetCode110.平衡二叉树、LeetCode257. 二叉树的所有路径、LeetCode404.左叶子之和


Python - 代码随想录算法训练营第十七天 | LeetCode110.平衡二叉树、LeetCode257. 二叉树的所有路径、LeetCode404.左叶子之和


前言


110.平衡二叉树

题目链接

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

示例 1:

给定二叉树 [3,9,20,null,null,15,7]
在这里插入图片描述
返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]

在这里插入图片描述
返回 false 。

思路:

每一层的处理如下:

  1. 没有根节点 ,返回-1(即false)
  2. 左子树不平衡,返回-1
  3. 右子树不平衡,返回-1
  4. abs(左子树高度-右子树高度)>1,返回-1
  5. 返回1(根节点在第一层) + max(左子树高度,右子树高度)

代码如下:

# 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 isBalanced(self, root: Optional[TreeNode]) -> bool:
        if self.height(root) != -1:
            return True 
        else: 
            return False 
    def height(self, node) -> bool: 
        if not node: 
            return 0*   
        left_height = self.height(node.left)   
        right_height = self.height(node.right)   


        if left_height== -1 or right_height== -1 or abs(left_height - right_height) > 1:



            return -1   
        else:   
            return 1 + max(left_height,right_height)   

':='主要作用是用在判断中,判断的同时,将这个值取出。

if  b := len(a) > 1:    

#等价于  

b=len(a)    
if b>1    

257. 二叉树的所有路径

题目链接

给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明: 叶子节点是指没有子节点的节点。

示例:
在这里插入图片描述

思路:

每一层的处理都是:

  1. 如果cur为空,就不进行下一层递归了
  2. 否则,cur就是我们要记录路径上的节点,先放进path中。
  3. 如果到叶子节点了,就生成路径
  4. 如果还有左/右结点,递归。

代码如下:

递归+隐形回溯

# 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 binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        if not root:
            return []
        result = []
        self.traver(root,[],result)
        return result

    def traver(self,cur: TreeNode, path: List[int], result: List[str]) -> None:
        if not cur:
            return
        path.append(cur.val)
        if not cur.left and not cur.right:
            result.append('->'.join(map(str, path)))
        if cur.left:
            self.traver(cur.left, path[:], result)
        if cur.right:
            self.traver(cur.right, path[:], result)


result.append('->'.join(map(str, path)))

其中,

  1. map() 会根据提供的函数对指定序列做映射。
    map(str,path)即把path中的数据转换为str类型
  2. join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
	seq = ("a", "b", "c") # 字符串序列     
	print(str.join( seq ))      
	
	#结果是:a-b-c

404.左叶子之和

题目链接

计算给定二叉树的所有左叶子之和。

示例:

在这里插入图片描述

思路:

其实就是求叶子节点,但是只要左边的叶子节点。
每一层都是:
左子树的左节点的值+右子树的左节点的值
核心思路 :找到左节点

 # 左子树即为左叶子节点
        if root.left and not root.left.left and not root.left.right:
            left_val = root.left.val

代码如下:

# 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 sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        if root.left is None and root.right is None:
            return 0
        left_val = self.sumOfLeftLeaves(root.left)

        # 左子树即为左叶子节点
        if root.left and not root.left.left and not root.left.right:
            left_val = root.left.val

        right_val = self.sumOfLeftLeaves(root.right)

        sum_val = left_val + right_val  
        return sum_val

总结

  1. 待改进: 这部分递归的思路还需要学习。

  2. 收获: ’ '.join(map(str,[1,2,3])) 的含义

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值