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

迭代法最好理解…跳过干啥…

110.平衡二叉树

平衡二叉树:左右层数相差最多为1(包括每一个节点的子树)

# 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:
        if not root:
            return True
        leftdepth = self.getdepth(root.left) #左子树的高度
        rightdepth = self.getdepth(root.right)  
        print(leftdepth)
        print(rightdepth) 
        if leftdepth-rightdepth == -1 or leftdepth-rightdepth == 1:#比较总深度
            return True
        elif leftdepth-rightdepth == 0 and leftdepth != -2:#层高相等,且不等于标记符
            return True
        else:
            return False

    def getdepth(self,node):
        if not node:
            return 0
        leftnum = self.getdepth(node.left)#获取高度
        rightnum = self.getdepth(node.right)
        if leftnum == -2 or rightnum == -2 or abs(leftnum - rightnum) > 1:#每层都需要比较是否为平衡二叉树
            return -2#随便返回一个标记符

        return max(leftnum+1,rightnum+1)#深度,+1是根节点

257. 二叉树的所有路径

第一次涉及回溯……二叉树要给人看晕了……

回溯:把已经放进去的元素依次弹出,在重新放进需要的内容,保证栈内存储的东西仅仅是此时需要输出的(记录路径)

递归每次都让我觉得不太好理解,但是有很绝妙……不熟啊不熟,还需要多练习,一看就懂,自己写根本想不到

# 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]:
        if not root:
            return root

        path = []#当前路径
        result = []#按照要求形式输出结果
        self.travelsal(root,path,result)
        return result

    def travelsal(self,node,path,result):#输入参数:当前节点、目前的path、result
        path.append(node.val)

        #终止条件
        if not node.left and not node.right:#没有左右节点-->到达这条路径终点(叶子结点)
            Spath = '->'.join(map(str,path))#path的输出形式
            result.append(Spath)#入栈
            return 

        #可以把左子树全部遍历完
        if node.left:#存在左节点
            self.travelsal(node.left,path,result)
            path.pop()#在递归结束后pop掉这个节点,方便下来存右节点
        
        if node.right:#存在左节点
            self.travelsal(node.right,path,result)
            path.pop()#在递归结束后pop掉这个节点,方便下来存右节点

404.左叶子之和

首先理解左叶子,叶子节点是不再有子节点的节点。像下面这个二叉树,左叶子只有9+15=21

# 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:
        res = self.get_leftsum(root)
        return res

    def get_leftsum(self,root):#输入参数
        if not root:
            return 0
        if not root.left and not root.right:#当前节点为叶子节点,但是无法判断左右,所以不处理
            return 0

        #找左子树的左叶子
        leftval = self.get_leftsum(root.left)
        if root.left and not root.left.left and not root.left.right:#左节点存在,且为叶子节点(需要通过父节点来判断次叶子是否为左叶子)
            leftval = root.left.val#取值

        #找右子树的左叶子
        rightval = self.get_leftsum(root.right)   

        leftsum = leftval+rightval

        return leftsum

有难度,看代码能理解,但是自己很难写出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值