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

二叉树深度应用:差值计算、众数查找与公共祖先判定

访客 技术 2026年10月4日 1

二叉搜索树中的最小绝对差

在处理二叉搜索树(BST)时,利用其有序性是优化算法的关键。二叉搜索树的中序遍历结果是一个单调递增的序列,因此任意两个节点差值的最小值,必然出现在中序遍历中相邻的两个节点之间。

通过维护一个指向前趋节点的指针,我们可以在遍历过程中实时计算差值并更新全局最小值。

public class Solution {
    private int smallestGap = int.MaxValue;
    private TreeNode prevNode = null;

    public int GetMinimumDifference(TreeNode root) {
        CalculateMinGap(root);
        return smallestGap;
    }

    private void CalculateMinGap(TreeNode current) {
        if (current == null) return;

        // 执行中序遍历:左-根-右
        CalculateMinGap(current.left);

        if (prevNode != null) {
            int currentGap = current.val - prevNode.val;
            if (currentGap < smallestGap) {
                smallestGap = currentGap;
            }
        }
        prevNode = current;

        CalculateMinGap(current.right);
    }
}

实现要点在于 prevNode 的初始化与更新。在递归过程中,prevNode 始终记录当前节点在有序序列中的前一个位置,从而避免了将树转换为显式数组的额外空间开销。

寻找二叉搜索树中的众数

如果将二叉搜索树视为一个有序数组,寻找众数的问题就变成了统计连续相同元素出现频率的问题。通过中序遍历,我们可以直接在处理节点时完成频率统计,无需使用哈希表记录所有节点的频率。

public class Solution {
    private int maxFreq = 0;
    private int currentFreq = 0;
    private TreeNode lastNode = null;
    private List<int> modes = new List<int>();

    public int[] FindMode(TreeNode root) {
        InOrderModeSearch(root);
        return modes.ToArray();
    }

    private void InOrderModeSearch(TreeNode node) {
        if (node == null) return;

        InOrderModeSearch(node.left);

        // 统计当前数值的频率
        if (lastNode != null && lastNode.val == node.val) {
            currentFreq++;
        } else {
            currentFreq = 1;
        }

        // 更新众数列表
        if (currentFreq > maxFreq) {
            maxFreq = currentFreq;
            modes.Clear();
            modes.Add(node.val);
        } else if (currentFreq == maxFreq) {
            modes.Add(node.val);
        }

        lastNode = node;

        InOrderModeSearch(node.right);
    }
}

在该逻辑中,每当发现更高的频率时,我们通过 modes.Clear() 清除旧的结果并存入新值;若频率持平,则将数值加入集合。这种方式保证了算法在 $O(1)$ 的额外空间复杂度(不计递归栈)下运行。

二叉树的最近公共祖先 (LCA)

寻找最近公共祖先是一个经典的回溯问题。对于给定的两个节点 $p$ 和 $q$,我们需要自底向上地搜索。如果一个节点的左子树包含了 $p$(或 $q$),而右子树包含了 $q$(或 $p$),那么该节点即为最近公共祖先。

public class Solution {
    public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        // 终止条件:找到目标节点或触及叶子节点
        if (root == null || root == p || root == q) {
            return root;
        }

        // 递归向左右子树搜索
        TreeNode leftResult = LowestCommonAncestor(root.left, p, q);
        TreeNode rightResult = LowestCommonAncestor(root.right, p, q);

        // 如果左右子树各返回一个非空节点,说明当前节点就是分叉点
        if (leftResult != null && rightResult != null) {
            return root;
        }

        // 否则返回非空的那一侧搜索结果(即向上层传递已找到的节点)
        return leftResult ?? rightResult;
    }
}

这里的核心逻辑在于递归的返回值。如果 leftResult 和 rightResult 均不为空,说明当前节点是 $p$ 和 $q$ 的分叉点;如果仅有一侧不为空,说明 $p$ 和 $q$ 都在该侧,或者目前只找到了其中一个,需要继续向上传递该发现结果。

返回列表

上一篇:基于ThreadLocal的轻量级登录认证方案

没有最新的文章了...

相关文章

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...

发表评论

访客

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