代码随想录学习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
相关推荐
深蓝海拓22 分钟前
PySide6从0开始学习的笔记(二十六) 重写Qt窗口对象的事件(QEvent)处理方法
笔记·python·qt·学习·pyqt
星火开发设计2 小时前
C++ 预处理指令:#include、#define 与条件编译
java·开发语言·c++·学习·算法·知识
BackCatK Chen3 小时前
第 1 篇:软件视角扫盲|TMC2240 软件核心特性 + 学习路径(附工具清单)
c语言·stm32·单片机·学习·电机驱动·保姆级教程·tmc2240
深蓝海拓3 小时前
PySide6从0开始学习的笔记(二十五) Qt窗口对象的生命周期和及时销毁
笔记·python·qt·学习·pyqt
理人综艺好会3 小时前
Web学习之用户认证
前端·学习
●VON3 小时前
React Native for OpenHarmony:项目目录结构与跨平台构建流程详解
javascript·学习·react native·react.js·架构·跨平台·von
AI视觉网奇3 小时前
FBX AnimSequence] 动画长度13与导入帧率30 fps(子帧0.94)不兼容。动画必须与帧边界对齐。
笔记·学习·ue5
woodykissme4 小时前
倒圆角问题解决思路分享
笔记·学习·工艺
黎雁·泠崖4 小时前
Java核心基础API学习总结:从Object到包装类的核心知识体系
java·开发语言·学习
香芋Yu4 小时前
【机器学习教程】第02章:线性代数基础【下】
学习·机器学习