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

一、LeetCode110. 平衡二叉树

        1:题目描述(110. 平衡二叉树

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

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

 

        2:解题思路

# 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:
        # 递归法
        def balanced(node):
            if node == None:
                return 0                   # 节点为空,返回节点高度为0
            node_left = balanced(node.left)             # 获取左子树的高度
            if node_left == -1: return -1               # 如果左子树的高度为-1,则向上层节点返回-1,表示不是平衡二叉树
            node_right = balanced(node.right)           # 获取右子树的高度
            if node_right == -1: return -1              # 如果右子树的高度为-1,则向上层节点返回-1,表示不是平衡二叉树
            result = 0
            if abs(node_left - node_right) > 1:         # 当左右子树的高度差的绝对值大于1,表示不是平衡二叉树,向上层节点返回-1
                result = -1
            else:                                       
                # 当左右子树的高度差的绝对值小于等于1,表示是平衡二叉树,向上层节点返回节点的高度
                result = 1 + max(node_left, node_right)
            return result
        res = balanced(root)
        if res == -1:
            return False
        else:
            return True

 二、LeetCode257. 二叉树的所有路径

        1:题目描述(257. 二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

        2:解题思路

# 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]:
        def treepath(node, res, result):
            # 递归
            # 使用前序遍历
            # 先将当前节点加入到路径中,及中间节点
            res.append(str(node.val))
            if node.left == None and node.right == None:   # 当节点没有左右子节点时,说明就是叶子节点了
                # print(res)
                s = "->".join(res)                         # 将存储路径节点,转化为中间使用“->”连接的字符串
                result.append(s)                           # 将路径加入到最终输出的列表中
            # 再遍历节点的左节点
            if node.left:
                treepath(node.left, res, result)
                # 当遍历完左节点后,需要将遍历过的节点弹出,及回溯到上一个节点
                # 方便进行下一个路径的遍历
                res.pop()
            # 遍历节点的右节点
            if node.right:
                treepath(node.right, res, result)
                # 当遍历完右节点后,需要将当前节点下的节点进行弹出,及回溯到上一个节点
                # 方便进行下一个路径的遍历
                res.pop()
            return result
        res = []
        result = []
        if not root:
            return result
        results = treepath(root, res, result)
        return results

 三、LeetCode404. 左叶子之和

        1:题目描述(404. 左叶子之和

给定二叉树的根节点 root ,返回所有左叶子之和。

        2:解题思路

# 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 root == None:
            return 0               # 节点为空,不存在左叶子节点
        if  root.left == None and root.right == None:
            return 0               # 节点的左右子节点均为空,说明节点是叶子节点,但不是确定是左叶子节点,因为使用父节点来统计左叶子节点,所以返回0
        left_sum = self.sumOfLeftLeaves(root.left)   # 求左子树的左叶子节点数的总和
        if root.left != None and root.left.left == None and root.left.right == None:
            left_sum += root.left.val       # 当父节点的左节点不为空,左节点的左右子节点为空,说明左节点是个左叶子节点
        right_sum = self.sumOfLeftLeaves(root.right) # 求右子树的左叶子节点数的总和
        return left_sum + right_sum         # 左子树的左叶子节点+右子树的左叶子节点总和
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值