先中序遍历,对中序遍历得到的数组进行排序,将排序之后的数组与排序之前的数组比较,就可以找到是哪两个数进行了交换。
再中序遍历二叉树进行节点的值的交换,得到结果。
但是写得不够简洁,性能并不怎么样。
public void recoverTree(TreeNode root) { ArrayList<Integer> result = inOrder(root); int[] a = result.stream().mapToInt(Integer::valueOf).toArray(); int[] b = Arrays.copyOf(a,a.length);//b是原始顺序 Arrays.sort(a);//a是排序好的 //经过比较可找出是哪两个数字进行了位置交换 int m = MAX_VALUE,n = m; for(int i = 0;i<a.length;i++){ if(b[i] != a[i]){ m = b[i]; n = a[i]; //找到了交换了的两个数值 break; } } //遍历树,找到对应节点,进行交换 inSearch(m,n,root); } private void inSearch(int m, int n,TreeNode node) { if(node == null){ return; }else{ inSearch(m, n, node.left); if(node.val == m){ node.val = n; }else if(node.val == n){ node.val = m; } inSearch(m,n,node.right); } } ArrayList<Integer> list = new ArrayList<>(); private ArrayList<Integer> inOrder(TreeNode node){ if(node == null){ return list; }else { inOrder(node.left); list.add(node.val); inOrder(node.right); } return list; }
Morris中序遍历还是不会。
——2020.7.1