1、题目描述:


2、思路:

// 先中序遍历二叉搜索树树,遍历结果的元素应该单调递增
// 然后找出错误位置的节点
// 交换连个错误节点的值


3、代码:



package 二叉树;

import java.util.ArrayList;
import java.util.List;

public class 恢复二叉搜索树 {
public static void main(String[] args) {
TreeNode t1 = new TreeNode(1);
TreeNode t2 = new TreeNode(3);
TreeNode t3 = new TreeNode(2);
t1.left=t2;
t2.right=t3;
恢复二叉搜索树 a = new 恢复二叉搜索树();
a.recoverTree(t1);
}

// 先中序遍历二叉搜索树树,遍历结果的元素应该单调递增
// 然后找出错误位置的节点
// 交换连个错误节点的值
public void recoverTree(TreeNode root) {
ArrayList<Integer> travalResult = new ArrayList<>();
transTree(root, travalResult);
int[] missTreeNode = getMissTreeNode(travalResult);
reBuildTree(root, missTreeNode);
}

// 二叉搜索树的中序遍历结果递增
public void transTree(TreeNode root, List<Integer> travalResult) {
if (root == null) {
return;
}
transTree(root.left,travalResult);
travalResult.add(root.val);
transTree(root.right,travalResult);
}

// 2、8、6、7、4、9
// 2、4、6、7、9
// 获取错误的两个节点,前一个元素大于后一个元素
// 第一个前一个元素大于后一个元素的两个数的第一个数是错误元素
// 第二个前一个元素大于后一个元素的两个数的第二个数是错误元素
// 考虑特殊情况,两个错误元素是相邻的
public int[] getMissTreeNode(List<Integer> travalResult) {
int[] result = new int[2];
for (int i = 0; i < travalResult.size() - 1; i++) {
if (travalResult.get(i) > travalResult.get(i + 1)) {
if(result[0]==0){
result[0]=travalResult.get(i);
result[1]=travalResult.get(i+1);
}else {
result[1]=travalResult.get(i+1);
}
}
}
return result;
}

// 交换二叉树中的两个节点的值
public void reBuildTree(TreeNode root, int[] missTreeNode) {
if (root == null) {
return;
}
if (root.val == missTreeNode[0]) {
root.val = missTreeNode[1];
}else if(root.val == missTreeNode[1]){
root.val = missTreeNode[0];
}
reBuildTree(root.left, missTreeNode);
reBuildTree(root.right, missTreeNode);
}

public static class TreeNode {
public int val;
TreeNode left;
TreeNode right;

public TreeNode(int val) {
this.val = val;
}

}
}


。。