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

110.平衡二叉树

为什么要用后序遍历:

因为要先判断左右子树,才能进行中间的逻辑判断

class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        def height(root: TreeNode) -> int:
            if not root:
                return 0
            leftHeight = height(root.left)
            rightHeight = height(root.right)
            if leftHeight == -1 or rightHeight == -1 or abs(leftHeight - rightHeight) > 1:
                return -1
            else:
                return max(leftHeight, rightHeight) + 1

        return height(root) >= 0

# 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: TreeNode) -> bool:
        if self.get_height(root) != -1:
            return True
        else:
            return False

    def get_height(self, root: TreeNode) -> int:
        if not root:
            return 0

        #左
        if (left_height := self.get_height(root.left)) == -1:
            return -1

        #右
        if (right_height := self.get_height(root.right)) == -1:
            return -1
        #中
        if abs(left_height - right_height) > 1:   #abs绝对值
            return -1
        else:
            return 1 + max(left_height,right_height)

注意这个写法

  

257. 二叉树的所有路径

是当 cur不为空,其左右孩子都为空的时候,就找到叶子节点

class Solution:
    def binaryTreePaths(self, root: [TreeNode]) -> List[str]:
        path = ''
        result = []
        if not root:
            return result
        self.traversal(root,path,result)
        return result
    
    def traversal(self, cur: TreeNode, path: str, result: List[str]) -> None:
        path += str(cur.val)
        if not cur.left and not cur.right:
            result.append(path)
        if cur.left:
            self.traversal(cur.left,path + '->',result)
        if cur.right:
            self.traversal(cur.right,path + '->',result)
        # def dfs(res,path,root):
        #     if not root:
        #         return []
        #     #设置现场 为什么要放这个位置,如果到5,要判断下面有没有节点,不然会多->
        #     path += str(root.val)
        #     if not root.left and not root.right:
        #         res.append(path[:])
        #         return
        #     #设置现场
        #     path += '->'  
        #     #开始递归
        #     dfs(res,path,root.left)
        #     dfs(res,path,root.right)
        #     #省去回溯
        # res = []
        # path = ''
        # dfs(res,path,root)
        # return res

404.左叶子之和 

节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点

思维:先遍历父节点,判断他的左孩子是否为空的同时,判断左孩子的左孩子是否为空,即左孩子就是我们要找的值

# 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:
        self.ans = 0
        def dfs(root):
            if not root:
                return
            if root.left and not root.left.left and not root.left.right:
                self.ans += root.left.val

            dfs(root.left)
            dfs(root.right)
        dfs(root)
        return self.ans
class Solution:
    def sumOfLeftLeaves(self, root: TreeNode) -> int:
        if not root: 
            return 0
        
        left_left_leaves_sum = self.sumOfLeftLeaves(root.left)  # 左
        right_left_leaves_sum = self.sumOfLeftLeaves(root.right) # 右
        
        cur_left_leaf_val = 0
        if root.left and not root.left.left and not root.left.right: 
            cur_left_leaf_val = root.left.val 
            
        return cur_left_leaf_val + left_left_leaves_sum + right_left_leaves_sum # 中

       力扣

  • 自己看到题目的第一想法

       毫无头绪            

  • 看完代码随想录之后的想法 

  • 自己实现过程中遇到哪些困难

  • 今日收获,记录一下自己的学习时长
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值