day17|二叉树4

110.平衡二叉树

  1. 后序遍历,因为需要左右节点将节点信息返回給父节点,所以应该是左右中的顺序,为后序遍历。
  2. 在函数体中需要将result的判断条件加进去,一同将数值返回给上一层的结点。
class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        # 后序遍历返回每个孩子的高度
        if not root:
            return True
        # 返回树的高度
        # 重点是如何记录不符合条件的字数,利用-1进行记录,对不符合要求的字数记录为-1当成叶子节点的值,然后返回即可
        result = 0 
        def getHeight(node):
            if not node:
                return 0
            leftHeight = getHeight(node.left) 
            if leftHeight == -1:  return -1
            rightHeight = getHeight(node.right) 
            if rightHeight == -1: return -1
            if abs(leftHeight-rightHeight) > 1 :
                result = -1
            else: 
                result = max(leftHeight,rightHeight) + 1
            return result
        if getHeight(root) == -1:
            return False
        else: 
            return True

257.二叉树的所有路径

思路:利用前序(中左右),为什么需要使用前序呢?因为只有在使用前序的情况下,才能够记录这个节点后续的路径。
收集路径的过程就是回溯的过程,在回溯的过程的基础上将path一步一步弹出即可。

反思: traversal函数中,判断方式是如果当前路径走到头,那么此时应该将该path进行返回;一定要注意在递归方式中一次递归只考虑当前函数即可。

class Solution:
    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        # 递归的方式,前序遍历
        path = ''
        result = []
        if not root : 
            return result
        # 相当于在这其中加入了一个递归函数
        def traversal(root,path,result):
            # 按照中左右的顺序进行遍历
            path += str(cur.val)
            if not cur.left and not cur.right:
                result.append(path)
            if cur.left:
                traversal(cur.left,path+'->',result)
            if cur.right:
                traversal(cur.right,path+'->',result)
        return result

404.左叶子之和

关键点:如何判断该结点是左叶子

class Solution:
    def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
        value = 0
        result = []
        # 前中后序
        def traversal(node):
            # 判断当前节点是否为子树,把满足这种形式的节点保存下来
            if node.left and not node.left.left and not node.left.right:
                result.append(node.left.val)
            if node.left:
                leftresult = traversal(node.left)
            if node.right:
                rightresult = traversal(node.right)
        traversal(root)
        return sum(result)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值