当前位置:首页 > 技术 > 正文内容

二叉树相关算法问题解析与实现

访客 技术 2026年6月5日 1

平衡二叉树判断

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

示例 1:

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

示例 2:

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

递归解法:

# 定义节点类
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def checkBalance(self, root):
        return self.checkHeight(root) != -1

    def checkHeight(self, node):
        if not node:
            return 0
        leftHeight = self.checkHeight(node.left)
        rightHeight = self.checkHeight(node.right)
        if leftHeight == -1 or rightHeight == -1 or abs(leftHeight - rightHeight) > 1:
            return -1
        return max(leftHeight, rightHeight) + 1

获取所有根到叶子的路径

返回从根节点到所有叶子节点的路径。

示例:

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

迭代解法:

class Solution:
    def findPaths(self, root):
        if not root:
            return []
        stack, pathStack, result = [root], [str(root.val)], []
        while stack:
            current = stack.pop()
            path = pathStack.pop()
            if not current.left and not current.right:
                result.append(path)
            if current.right:
                stack.append(current.right)
                pathStack.append(f"{path}->{current.right.val}")
            if current.left:
                stack.append(current.left)
                pathStack.append(f"{path}->{current.left.val}")
        return result

计算左叶子节点之和

给定一棵二叉树,返回所有左叶子节点的值的总和。

示例:

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

递归解法:

class Solution:
    def sumLeftLeaves(self, root):
        totalSum = 0
        def helper(node, isLeft):
            nonlocal totalSum
            if not node:
                return
            if not node.left and not node.right and isLeft:
                totalSum += node.val
            helper(node.left, True)
            helper(node.right, False)
        helper(root, False)
        return totalSum

完全二叉树节点计数

计算一棵完全二叉树的节点总数。

示例:

输入:root = [1,2,3,4,5,6]
输出:6

优化解法:

class Solution:
    def countNodes(self, root):
        if not root:
            return 0
        leftDepth = rightDepth = 0
        leftNode, rightNode = root, root
        while leftNode:
            leftDepth += 1
            leftNode = leftNode.left
        while rightNode:
            rightDepth += 1
            rightNode = rightNode.right
        if leftDepth == rightDepth:
            return (1 << leftDepth) - 1
        return 1 + self.countNodes(root.left) + self.countNodes(root.right)

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。