leetcode——99.恢复二叉搜索树

先中序遍历,对中序遍历得到的数组进行排序,将排序之后的数组与排序之前的数组比较,就可以找到是哪两个数进行了交换。

再中序遍历二叉树进行节点的值的交换,得到结果。

但是写得不够简洁,性能并不怎么样。

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

 

posted @ 2020-07-01 11:28  欣姐姐  阅读(149)  评论(0编辑  收藏  举报