二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例
输入: [1,3,null,null,2]
1
/
3
\
2
输出: [3,1,null,null,2]
3
/
1
\
2
输入: [3,1,4,null,null,2]
3
/ \
1 4
/
2
输出: [2,1,4,null,null,3]
2
/ \
1 4
/
3
解法
思路:找到待交换节点,交换他们的val
如下图所示,中序遍历的结果是 4,2,3,1
,我们只要找到节点 4 和节点 1 ,交换他们的 val 即可。
这里我们有个规律发现这两个节点:
-
第一个节点:中序遍历,首次降序时,我们选取前一个节点,这里指节点 4;
-
第二个节点:第二次降序或只有一次降序时,我们选择后一个节点,这里指节点 1;
TreeNode first = null;
TreeNode second = null;
TreeNode pre = new TreeNode(Int32.MinValue);
public void RecoverTree(TreeNode root)
{
FindNode(root);
int temp = first.val;
first.val = second.val;
second.val = temp;
}
public void FindNode(TreeNode root)
{
if (root == null) return;
FindNode(root.left);
if (first == null && pre.val > root.val) first = pre;
if (first != null && pre.val > root.val) second = root;
pre = root;
FindNode(root.right);
}