day17(二叉树)-py

第六章二叉树part04

今日内容:110.平衡二叉树、 257. 二叉树的所有路径、 404.左叶子之和

代码随想录:代码随想录

二叉树解题三步:

1.明确递归函数的参数和返回值

2.明确终止条件

3.明确单层递归的逻辑

110.平衡二叉树

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

思路:主要是先理解题意,然后对题意进行拆分:主要实现两个功能,一个是得到左右子树的深度(输出为int),一个是根据深度判断深度是否相差1(输出为bool)。很好那就是写两个函数,一个实现深度输出,一个对二叉树进行遍历并判断是否平衡。

class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if root == None:
            return True
        leftdep = self.maxdepth(root.left)
        rightdep = self.maxdepth(root.right)
        rootjudge = False
        if (leftdep - rightdep) >= -1 and (leftdep - rightdep) <= 1:
            rootjudge = True
        left = self.isBalanced(root.left)
        right = self.isBalanced(root.right)
        return True if rootjudge*left*right else False

    def maxdepth(self, node):
        if node == None:
            return 0
        left = self.maxdepth(node.left)
        right = self.maxdepth(node.right)
        if left > right: depth = left
        else: depth = right
        return 1 + depth

257. 二叉树的所有路径

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

思路:感觉这题是最难的,有一个回溯的思想,总结得出以下几点:

1.涉及按照某种顺序进行遍历并且根据条件输出的,可以用队列解题。

2.我认为这题最关键的思想是回溯。在队列的基础上,因为有的根节点会重复利用,所以意味着不是一次性的,而叶子节点进出一次队列后就用不到了,这个时候就有一个回溯的思想。很关键,需要理解理解!

class Solution:
    def traversal(self, cur, path, result):
        path.append(cur.val)  # 中
        if not cur.left and not cur.right:  # 到达叶子节点
            sPath = '->'.join(map(str, path))
            result.append(sPath)
            return
        if cur.left:  # 左
            self.traversal(cur.left, path, result)
            path.pop()  # 回溯
        if cur.right:  # 右
            self.traversal(cur.right, path, result)
            path.pop()  # 回溯

    def binaryTreePaths(self, root):
        result = []
        path = []
        if not root:
            return result
        self.traversal(root, path, result)
        return result

404.左叶子之和

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

思路:感觉这题比上一题简单,思路和第一题差不多。就是拆分题意,后得出先判断是否是左叶子,如果是就加上val值,然后遍历。

class Solution:
    def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
        if root == None:
            return 0
        left = self.sumOfLeftLeaves(root.left)
        right = self.sumOfLeftLeaves(root.right)
        sumleft = self.isleftleaves(root.left)

        return sumleft + left + right

    def isleftleaves(self, node):
        if node == None:
            return 0
        if node.left == None and node.right == None:
            return node.val
        else:
            return 0

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值