题解:找到二叉搜索树中两个错误的节点

题解:找到二叉搜索树中两个错误的节点

💡 原文中文,约1200字,阅读约需3分钟。
📝

内容提要

本文讨论了如何在二叉搜索树中找到两个错误的节点。由于节点位置调换,树不再是有效的二叉搜索树。通过中序遍历,可以识别出降序的节点,从而确定错误节点。如果两个节点相邻,则直接找到;如果不相邻,则会出现两次降序,分别对应两个错误节点。使用Morris遍历法,时间复杂度为O(n),空间复杂度为O(1)。

🔎

延伸解读

中序遍历为何能定位错误节点

二叉搜索树的中序遍历结果本应严格升序。当两个节点被交换后,遍历序列中会出现降序对。若两节点相邻,仅有一处降序,直接取这两个节点;若不相邻,则有两处降序,第一处降序中较大的节点是错误节点,第二处降序中较小的节点是错误节点。这一规律是解题的核心依据。

Morris遍历的空间优势

常规中序遍历需借助栈或递归,空间复杂度为O(n)。Morris遍历利用叶子节点的空右指针临时指向中序后继,从而在遍历过程中无需额外存储结构,将空间复杂度降至O(1)。本文代码正是基于Morris实现,在保持O(n)时间的同时,显著节省了内存。

代码实现中的关键细节

在Morris遍历中,需正确处理临时链接的建立与拆除。当发现降序对时,若result[0]为空,则同时记录两个节点;否则仅更新result[0]为当前较小节点。注意,第一次降序时记录的是较大节点(prior)和较小节点(curr),第二次降序时仅更新较小节点,最终result数组即两个错误节点。

❓

Q&A

如何在二叉搜索树中找到两个错误的节点?

通过中序遍历识别降序的节点,从而确定错误节点。如果两个节点相邻,直接找到;如果不相邻,则会出现两次降序,分别对应两个错误节点。

中序遍历在识别错误节点中有什么作用?

中序遍历可以识别出降序的节点,降序的出现表明树中存在错误节点。

如果两个错误节点不相邻,如何识别它们?

如果两个错误节点不相邻,会出现两次降序,第一次降序时前面的较大元素是错误节点,第二次降序时后面的较小元素是错误节点。

Morris遍历法的时间和空间复杂度是多少?

Morris遍历法的时间复杂度为O(n),空间复杂度为O(1)。

为什么二叉搜索树会变得无效?

二叉搜索树变得无效是因为其中两个节点的位置被调换了。

如何判断两个节点是否相邻?

如果在中序遍历中只出现一次降序,则这两个节点是相邻的;如果出现两次降序,则它们不相邻。

🏷️

标签

➡️

继续阅读