内容提要
本文讨论了如何在二叉搜索树中找到两个错误的节点。由于节点位置调换,树不再是有效的二叉搜索树。通过中序遍历,可以识别出降序的节点,从而确定错误节点。如果两个节点相邻,则直接找到;如果不相邻,则会出现两次降序,分别对应两个错误节点。使用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)。
为什么二叉搜索树会变得无效?
二叉搜索树变得无效是因为其中两个节点的位置被调换了。
如何判断两个节点是否相邻?
如果在中序遍历中只出现一次降序,则这两个节点是相邻的;如果出现两次降序,则它们不相邻。