Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Example 1:
Input: [1,3,null,null,2]
1
/
3
\
2
Output: [3,1,null,null,2]
3
/
1
\
2
二叉搜索树,其中两个节点发生了对换,导致不再是二叉搜索树,要求复原二叉搜索树
二叉搜索树的条件,左子树的值 < root的值 < 右子树的值
思路:
如果用中序遍历二叉搜索树,结果应该是升序的
如果其中出现了违反升序的节点,就说明找到了发生对换的节点
注意题中说只对换了2个element,所以就比较简单一些
比如正常顺序:
1,2,3,4,5,6
而现在中序遍历得到
1,5,3,4,2,6
2本来应该在第2个位置,现在换到第5个,2本来比3小,因为正常应该是升序的,所以也就比3后面的都小,想找到2的位置,只需要找到最后一个前一节点>后一节点的位置
想找到5的位置,只需要找到第一个发生倒序的位置
遍历节点不需要保存到数组,只需要在中序遍历中完成
*注意java语言是按值传参数的,如果把TreeNode通过参数传递到函数内部,即使函数内部值改变,外部的值也还是不变,所以保存第一个倒序和最后一个倒序的TreeNode节点的定义放在class的global变量
class Solution {
TreeNode first = null;
TreeNode second = null;
TreeNode pre = null;
public void recoverTree(TreeNode root) {
if (root == null) {
return;
}
InorderTraversal(root);
int tmp = first.val;
first.val = second.val;
second.val = tmp;
}
public void InorderTraversal(TreeNode root) {
if (root == null) {
return;
}
InorderTraversal(root.left);
if (pre != null && pre.val > root.val) {
if (first == null) {
first = pre;
}
second = root;
}
pre = root;
InorderTraversal(root.right);
}
}