代码随想录学习Day 15

110.平衡二叉树

题目链接

讲解链接

判断是否为平衡二叉树:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。

二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。

二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。

本题考虑采用递归法求解,既然要求子树的高度,那么就要用到后序遍历。递归三部曲分析:

1.递归函数的参数及返回值:参数------当前传入节点;返回值------以当前传入节点为根节点的树的高度。若以当前节点为根节点的树不是平衡二叉树,则返回-1.

2.递归终止条件:若当前节点为空节点,则终止并返回0,意为以当前节点为根节点的数高度为0.

3.单层递归的逻辑:分别求出传入节点为根节点的二叉树的左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示不是二叉平衡树。

python 复制代码
class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        return False if self.get_height(root) == -1 else True
    def get_height(self, root):  # 递归函数传入参数为当前节点
        if not root:  # 如果当前节点为空,则返回当前节点为根节点的二叉树高度为0
            return 0
        left_height = self.get_height(root.left)  # 求左子树高度
        right_height = self.get_height(root.right)  # 求右子树高度
        if left_height == -1 or right_height == -1:  # 如果左子树或者右子树不是平衡二叉树,则返回-1
            return -1
        elif abs(left_height - right_height) > 1:  # 如果左右子树高度差大于1,则返回-1
            return -1
        else:
            return 1 + max(left_height, right_height)  # 返回当前节点为根节点的二叉树的高度

257.二叉树的所有路径

题目链接

讲解链接

思路:这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。这道题目第一次涉及到回溯,因为要把路径记录下来,需要回溯来回退一个路径再进入另一个路径。

递归三部曲:

1.递归函数参数及返回值:传入的根节点、记录路径的path以及结果集result,不需要返回值。

2.递归终止条件:找到叶子节点,即cur不为空,但cur的左右孩子均为空。

3.单层递归的逻辑:因为采用的是前序遍历,所以要先处理中间节点,先把中间节点放进path中,

python 复制代码
path.append(cur.val)

然后进行递归,判断当前节点的左右孩子是否为空,

python 复制代码
if cur.left:
    traversal(cur.left, path, result)
if cur.right:
    traversal(cur.right, path, result)

递归之后要进行回溯,因为要删除path中的节点,再加入新的节点得到新的路径。这里需要注意递归与回溯是一一对应的,有一个递归就必定有一个对应的回溯。

python 复制代码
if cur.left:
    traversal(cur.left, path, result)
    path.pop()
if cur.right:
    traversal(cur.right, path, result)
    path.pop()

完整代码如下:

python 复制代码
class Solution:
    def traversal(self, cur, path, result):
        path.append(cur.val)  # 中
        if not cur.left and not cur.right:  # 左右孩子均为空则代表到达叶子节点
            result.append('->'.join(map(str,path)))  # 将path中的元素转为字符串形式并用->连接
            return
        if cur.left:  # 左
            self.traversal(cur.left, path, result)  # 递归
            path.pop()  # 回溯
        if cur.right:  # 右
            self.traversal(cur.right, path, result)  # 递归
            path.pop()  # 回溯
    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        path = []
        result = []
        self.traversal(root, path, result)
        return result

404.左叶子之和

题目链接

讲解链接

本题要求的是左叶子之和,但是判断当前遍历的节点是否为左叶子是难以实现的,必须要通过节点的父节点来判断其左孩子是不是左叶子。 具体方法就是**判断当前节点的左孩子是否存在,若存在,再判断当前节点的左孩子的左右孩子是否均为空,**若是,则将其值加到结果中。

python 复制代码
class Solution:
    def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        stack = [root]
        result = 0
        while stack:  # 进行前序遍历
            node = stack.pop()
            if node.left and not node.left.left and not node.left.right:  # 左孩子存在且左孩子的左右孩子均为空,则说明是左叶子
                result += node.left.val
            if node.right:
                stack.append(node.right)
            if node.left:
                stack.append(node.left)
        return result
相关推荐
西岸行者3 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码3 天前
嵌入式学习路线
学习
毛小茛3 天前
计算机系统概论——校验码
学习
babe小鑫3 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms3 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下3 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。3 天前
2026.2.25监控学习
学习
im_AMBER3 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J3 天前
从“Hello World“ 开始 C++
c语言·c++·学习