D17|平衡二叉树+二叉树路径+左叶子之和

平衡二叉树

1.题目
给定一个二叉树,判断它是否是高度平衡的二叉树。
平衡二叉树
tips:如果不会做建议先去刷二叉树的最大深度
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 __init__(self):
        self.res = True
    
    def heighttree(self, root):
        if not root:
            return 0
        ldepth = self.heighttree(root.left)
        rdepth = self.heighttree(root.right)
        if abs(ldepth - rdepth) > 1:
            self.res = False
        return max(ldepth, rdepth) + 1
        
    def isBalanced(self, root: Optional[TreeNode]) -> bool: 
        # 求高度用后序遍历,去比较返回的左右子树的高度差
        # 这里可以提前剪枝将结果res变成-1从而快速结束递归
        if not root:
            return True
        self.heighttree(root)
        return self.res     

3.文章讲解
写法可以很多种,但是要注意遍历顺序以及单层逻辑

二叉树的所有路径

1.题目
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。
2.复习前
1)犹豫了遍历顺序,实践出真知!
2)python中的值传递(针对不可变数据类型,number/string/tuple)和引用传递(针对可变数据类型,list/map/set)python返回值的类型,注意这里如果是用数组的话如何回溯记录路径

# 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 __init__(self):
        self.res = []

    def treepath(self, root, tmp):
        if not root:
            return
        tmp.append(str(root.val))
        if not root.left and not root.right:
            if len(tmp) == 1:
                self.res.append(tmp)
            else:
                self.res.append("->".join(tmp)) 
        if root.left:    
            self.treepath(root.left, tmp)
            tmp.pop()
        if root.right:
            self.treepath(root.right, tmp)
            tmp.pop()

    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        # 采用前序遍历,到叶子节点时加入数组res;每条路径用字符串记录不用数组会写起来方便点
        # 数组为可变元素,所以需要做pop处理即回溯操作,而字符串可以以参数形式传递中间用+连接,而不改变当前root记录的字符串
        tmp = []
        if not root.left and not root.right:
            return [str(root.val)]
        self.treepath(root, tmp)
        return self.res

3.文章讲解
尝试用string记录path,重刷!

左叶子之和

1.题目
给定二叉树的根节点 root ,返回所有左叶子之和。
左叶子之和
注意:左叶子也是叶子节点,只不过是满足root.left
2.实现
复习前:
对于如何去求和并作为返回值返回的情况写不对,不能写:
return root.left.val 而是应该返回给lres

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

    def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
        # self.sumleft(root)
        # return self.res
        if not root:
            return 0
        lres = self.sumOfLeftLeaves(root.left)
        if root.left:
            if not root.left.left and not root.left.right:
                lres += root.left.val
        rres = self.sumOfLeftLeaves(root.right)
        return lres + rres

3.文章讲解
注意:对于不清楚单层逻辑的题目,建议对left和right分别取变量名,进行运算或返回,以便弄清楚处理顺序

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值