恢复二叉搜索树
1、题目描述:
https://leetcode-cn.com/problems/recover-binary-search-tree/
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; } } }
。。