码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-07-01 12:55:45      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:arch   length   dash   http   oid   recover   恢复   col   顺序   

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

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

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

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

 

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

标签:arch   length   dash   http   oid   recover   恢复   col   顺序   

原文地址:https://www.cnblogs.com/taoyuxin/p/13218260.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!