研习代码 day15 | 平衡二叉树、二叉树的所有路径、左叶子之和

一、平衡二叉树

        1.1 题目

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

        本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = []
输出:true

提示:

  • 树中的节点数在范围 [0, 5000] 内
  • -10^4 <= Node.val <= 10^4

        1.2 题目链接

        110.平衡二叉树

        1.3 解题思路与过程想法

        (1)解题思路

        # 统计树的高度,最简便的方式就是利用后序遍历
        # 但需在统计高度的同时,记录该树是否是平衡二叉树
        # 若不是,则返回高度为-1,否则正常统计树的高度

        (2)过程想法

        稍加修改的递归题,需会辨别并做出

        1.4 代码

class Solution:
    def height(self,root) -> int:
        if not root:
            return 0
        
        # 左
        l = self.height(root.left)
        if l == -1:
            return -1
        
        # 右
        r = self.height(root.right)
        if r == -1:
            return -1

        # 根
        if abs(l - r) > 1:
            return -1
        else:
            return max(l,r) + 1

    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        # 统计树的高度,最简便的方式就是利用后序遍历
        # 但需在统计高度的同时,记录该树是否是平衡二叉树
        # 若不是,则返回高度为-1,否则正常统计树的高度
        if self.height(root) == -1:
            return False
        else:
            return True
        

二、二叉树的所有路径

        2.1 题目

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

        叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

示例 2:

输入:root = [1]
输出:["1"]

提示:

  • 树中节点的数目在范围 [1, 100] 内
  • -100 <= Node.val <= 100

        2.2 题目链接

        257.二叉树的所有路径

        2.3 解题思路与过程想法

        (1)解题思路

        # 使用前序遍历递归:根左右
        # 找到叶子节点,进出处理--->回溯向上--->判断其他分支节点

        (2)过程想法

        思考过程中有想过回溯,但对回溯不是很熟。

        2.4 代码

class Solution:
    def TreePath(self,root,path,res):
        # 使用前序遍历递归:根左右
        # 找到叶子节点,进出处理--->回溯向上--->判断其他分支节点

        # 根
        path.append(root.val)
        # 递归出口:递归到叶子节点,处理 path 中的内容,将前者加入 res 
        if not root.left and not root.right:
            # map函数将path列表中的每个元素转换为字符串类型
            pathS = '->'.join(map(str,path))
            res.append(pathS)

        # 左
        if root.left:
            self.TreePath(root.left,path,res)
            # 回溯:否则无法往上退出,去遍历其他分支节点
            path.pop()
        
        # 右
        if root.right:
            self.TreePath(root.right,path,res)
            # 回溯:否则无法往上退出,去遍历其他分支节点
            path.pop()

    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        res = []
        path = []

        if not root:
            return res
        else:
            self.TreePath(root,path,res)
            return res

三、左叶子之和

        3.1 题目

        给定二叉树的根节点 root ,返回所有左叶子之和。

示例 1:

输入: root = [3,9,20,null,null,15,7] 
输出: 24 
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

示例 2:

输入: root = [1]
输出: 0

提示:

  • 节点数在 [1, 1000] 范围内
  • -1000 <= Node.val <= 1000

        3.2 题目链接

        404.左叶子之和

        3.3 解题思路与过程想法

        (1)解题思路

         # 使用后序递归遍历来计算左叶子的数量
         # 左叶子的判断:左指针的左右指针都为空
         # 两层的小树中,只有左子树中才会出现左叶子节点

        (2)过程想法

        稍加修改的递归题,需会辨别并做出

        3.4 代码

class Solution:
    def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
        # 使用后序递归遍历来计算左叶子的数量
        l = 0
        r = 0

        # 递归出口:当前节点为空,或其没有左右子树
        if not root:
            return 0

        if not root.left and not root.right:
            return 0

        # 左
        if root.left:
            l = self.sumOfLeftLeaves(root.left)
        # 左子树是左叶子的情况
        if root.left and not root.left.left and not root.left.right:
            l = root.left.val

        # 右
        if root.right:
            r = self.sumOfLeftLeaves(root.right)

        # 根
        return l + r
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值