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

文章介绍了如何用Python实现平衡二叉树的高度计算方法,使用递归策略,并涉及二叉树的路径遍历以及特定问题如左叶子节点之和的求解。着重展示了递归和回溯在解决这些问题中的应用。
摘要由CSDN通过智能技术生成

110.平衡二叉树

自定义一个函数求高度,然后递归,遍历顺序选择后序遍历

若子树不是平衡二叉树,那整棵树一定不是平衡二叉树,所以将这种情况下高度直接返回-1

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def isBalanced(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        return self.height(root) != -1   # 只要求height得到的是-1,则说明不是平衡二叉树

    def height(self, node):
        """
        求树的高度,若子树不是平衡二叉树,则直接返回-1,否则返回树的高度
        """
        if not node:
            return 0
        leftheight = self.height(node.left)
        if leftheight == -1:
            return -1
        rightheight = self.height(node.right)
        if rightheight == -1:
            return -1
        if abs(leftheight-rightheight) > 1:
            return -1
        return 1+max(leftheight, rightheight)

257. 二叉树的所有路径

回溯不太熟悉

因为还要回来走另一条岔路,所以需要回溯

主要是递归还是难写啊

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def traversal(self, cur, path, res):  # path存放每一条路径,res存放最终结果
        # 中
        path.append(cur.val)
        if not cur.left and not cur.right:  # 到达叶子节点
            s_path = '->'.join(map(str, path))
            res.append(s_path)
            return
        # 左
        if cur.left:
            self.traversal(cur.left, path, res)
            path.pop()  # 回溯
        # 右
        if cur.right:
            self.traversal(cur.right, path, res)
            path.pop()
    
    
    def binaryTreePaths(self, root):
        """
        :type root: TreeNode
        :rtype: List[str]
        """
        path = []
        res = []
        if not root:
            return []
        self.traversal(root, path, res)
        return res

404.左叶子之和 

虽然知道怎么遍历,有思路,但是递归的单层逻辑什么的还是写不太清。。。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def sumOfLeftLeaves(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if not root:
            return 0
        leftvalue = self.sumOfLeftLeaves(root.left) # 左子树上的左叶子之和
        if root.left and not root.left.left and not root.left.right:  # 左叶子的定义
            leftvalue = root.left.val
        rightvalue = self.sumOfLeftLeaves(root.right)  # 右子树上的左叶子之和
        sum = leftvalue + rightvalue
        return sum

代码随想录代码随想录代码随想录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值