题目:
二叉搜索树BST中有两个结点的值互相放错了位置,找出并交换它们。
思路:若依据BST性质,使用ArrayList存储其中序遍历,可以很方便的找出题目要求的两个值,但是空间复杂度为O(n)。
这里有两种情况需要注意:
1.两个放错位置的结点相邻,如 中序遍历为:1,2,4,3,5. 则pre.val>cur.val的情况只发生了一次;
2.两个结点不相邻,如 1,4,3,2,5. 则pre.val>cur.val的情况发生了两次。
一个很精妙的方法如下:
public class Solution {
private TreeNode first=null;//first和second存放需要交换的两个结点。
private TreeNode second=null;
private TreeNode pre=null;//pre存放中序遍历的上一个结点.
public void recoverTree(TreeNode root) {
if(root == null)
return;
inOrder(root);
if(first!=null&&second!=null)
{
int temp=first.val;
first.val=second.val;
second.val=temp;
}
}
public void inOrder(TreeNode root)
{
if(root.left!=null)
inOrder(root.left);
if(pre!=null&&pre.val>root.val)//若pre.val>root.val只发生了一次,first和second存放该相邻两结点
{ //若pre.val>root.val发生两次,second存放第二个结点。
if(first == null)
{
first=pre;
}
second=root;
}
pre=root;
if(root.right!=null)
inOrder(root.right);
}
本文介绍了一种O(1)空间复杂度的方法来修复二叉搜索树中两个结点的位置错误,包括两种情况的处理:相邻结点和非相邻结点。通过中序遍历和特定的条件判断实现结点位置的正确交换。
17万+

被折叠的 条评论
为什么被折叠?



