//给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。
思路:二叉搜索树特点:左子节点<根节点<右子节点;中序遍历二叉搜索树递增排列。
中序遍历二叉树,在遍历过程中记录前一次遍历的节点pre,若pre.val大于当前遍历节点值,则pre为第一个出错的节点;继续遍历当pre又一次大于当前节点值,则当前节点为第二个出错的节点。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public class RecoverTree {
private TreeNode pre; //临时变量 记录上一次遍历的位置
private TreeNode shift1; //错误节点1
private TreeNode shift2; //错误节点2
public void recoverTree(TreeNode root) {
inOrderTree(root); //中序遍历找到出错的节点
int temp = shift1.val;
shift1.val = shift2.val;
shift2.val = temp;
}
public void inOrderTree(TreeNode root) {
if (null != root) {
inOrderTree(root.left);
if (null != pre && pre.val > root.val) {
if (null == shift1) {
shift1 = pre;
shift2 = root;
} else { //一直往前找 直到不在小于
shift2 = root;
}
}
pre = root;
inOrderTree(root.right);
}
}
}