
力扣783.二叉搜索树节点最小距离
发布日期:2021-05-15 01:04:53
浏览次数:19
分类:精选文章
本文共 1534 字,大约阅读时间需要 5 分钟。
在这里,我们将讨论如何通过深度优先搜索遍历二叉搜索树,并计算相邻节点值之间的最小差值。根据二叉搜索树的性质,左子树的值小于其父节点,右子树的值大于其父节点。因此,进行一次中序遍历可以按从小到大顺序记录所有节点的值,从而找到所有相邻节点之间的最小差值。
深度优先搜索(DFS):由于二叉搜索树的结构,DFS能够按特定顺序访问节点。每次访问一个节点,记录其值,与前一个已访问的节点的值比较,计算差值,并更新最小差值。
递归实现:使用递归函数进行DFS遍历。在函数访问每个节点时,首先处理已访问的前一个节点,计算差值,然后递归访问左子树,接着是右子树。这种方法确保了记录了所有相邻节点的差值。
节点顺序管理:通过使用一个变量记录当前节点是第一次访问还是之后的访问,可以避免在第一次访问时(没有前驱节点时)计算错误差值。
以下是函数的一种实现方式:
int minDiffInBST(TreeNode root) { if (root == null) { return Integer.MAX_VALUE; } int minDiff = Integer.MAX_VALUE; // 使用辅助函数进行递归遍历 traverse(root, -1, minDiff, root.val); return minDiff != Integer.MAX_VALUE ? minDiff : -1;}// 辅助函数:递归深度优先遍历void traverse(TreeNode node, int prevVal, int& minDiff, int currentVal) { if (node == null) { return; } // 初始访问(没有prevVal) if (prevVal == -1) { prevVal = currentVal; // 记录当前值为prevVal } else { // 计算当前节点与前一个节点的差值 int diff = node.val - prevVal; if (diff < minDiff) { minDiff = diff; } prevVal = node.val; // 更新prevVal为当前节点的值 } // 递归访问左子树 traverse(node.left, prevVal, minDiff, node.val); // 递归访问右子树 traverse(node.right, prevVal, minDiff, node.val);}
步骤解释:
初始化变量:函数minDiffInBST
开始时,初始化minDiff
为Integer.MAX_VALUE
表示尚未找到最小值。
调用辅助函数:不管是否为空树,辅助函数都会被调用。辅助函数接受当前节点、上一个节点的值、最小差值以及当前节点的值。
进入新节点:当函数进入新节点时,检查是否是第一次(prevVal == -1
)。如果是,记录当前值为prevVal
;否则,计算当前节点与prevVal
的差值,并更新minDiff
。
递归访问:递归处理左子树和右子树,再次调用函数,继续比较差值。
返回结果:如果树为空,返回较大的数值,否则返回最小的差值。
这种方法确保了在遍历过程中,所有相邻节点之间的差值都被比较,从而找到最小值。该遍历顺序符合二叉搜索树的性质,能够高效地解决问题。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月30日 14时56分53秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux部署Elasticsearch(一):下载和部署Elasticsearch
2025-04-10
Linux(3):Linux命令-文件管理
2025-04-10
Linux:安装Redis
2025-04-10
ListBox 循环删除当前项
2025-04-10
Listview 利用Datapager进行分页
2025-04-10
listview数据刷新后自动滑到底部
2025-04-10
liunx-FTP服务器_无需整理
2025-04-11
Liunx挂载nfts盘数据方法
2025-04-11
LiveGBS user/save 逻辑缺陷漏洞复现(CNVD-2023-72138)
2025-04-11
live和on的区别
2025-04-11
li下的ul----多级列表
2025-04-11
LLM;超越记忆《第 2 部分 》
2025-04-11
LLVM 简介-ChatGPT4o作答
2025-04-11
localhost:5000在MacOS V12(蒙特利)中不可用
2025-04-11
localStorage使用总结
2025-04-11
Lock 锁底层实现
2025-04-11
Lock和synchronized区别(以及Lock的使用)
2025-04-11
logback配置文件详解
2025-04-11
logging.config报错FileNotFoundError
2025-04-11
Logstash input jdbc连接数据库
2025-04-11