Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Note:
A solution using O(n ) space is pretty straight forward. Could you devise a constant space solution?
confused what"{1,#,2,3}"means?
package niuke.day1;
public class Recover_Binary_search_tree1 {
TreeNode pre,p,q; //设三个树节点为全局变量
public static void main(String[] args) {
}
public void recoverTree(TreeNode root) {
p = q = pre = null; //对全局变量进行初始化
dfs(root); //调用dfs()函数,似的p,q分别指向两个位置错误的位置
int temp = p.val; //把p,q的值互相交换,就会达到目的
p.val = q.val;
q.val = temp;
}
//若想到了中须遍历二叉搜索树,相当于一个递增的数列,换了两个位置,换位置位置发现不同,会对编程有大大的帮助
private void dfs(TreeNode root) {
//递归调用,先左子树,再根节点,再右子树,实现了整个二叉搜索树的按数值从小到大的遍历
// TODO Auto-generated method stub
if(root == null) //若遇到空节点则返回跳过,我感觉对于二叉树的递归都有这个,得记住了。
return;
dfs(root.left);
if(pre != null && pre.val > root.val) { //先放pre!=null,是因为怕出现空节点异常
if(p == null) { //若此时没有找到出错的第一个节点,则把pre当成第一个为p,
/*把root当成q,若之后没有再进入判断,没有找到第二个出错的,则第二个出错的就为root*/
p = pre;
q = root;
}else { //若出现了第二个出错的,则把第二个节点录入为q
q = root;
}
}
pre = root; //然后把root传递给pre,保证了pre是中序遍历中root的前一个元素,则好进行下一个对比
dfs(root.right);
}
}