zoukankan      html  css  js  c++  java
  • Recover Binary Search Tree -- LeetCode

    原题链接: http://oj.leetcode.com/problems/recover-binary-search-tree/ 
    这道题是要求恢复一颗有两个元素调换错了的二叉查找树。一開始拿到可能会认为比較复杂,事实上观察出规律了就比較简单。主要还是利用二叉查找树的主要性质,就是中序遍历是有序的性质。那么假设当中有元素被调换了,意味着中序遍历中必定出现违背有序的情况。那么会出现几次呢?有两种情况,假设是中序遍历相邻的两个元素被调换了,非常easy想到就仅仅需会出现一次违反情况,仅仅须要把这个两个节点记录下来最后调换值就能够;假设是不相邻的两个元素被调换了,举个样例非常easy能够发现,会发生两次逆序的情况,那么这时候须要调换的元素应该是第一次逆序前面的元素,和第二次逆序后面的元素。比方1234567,1和5调换了,会得到5234167,逆序发生在52和41,我们须要把4和1调过来,那么就是52的第一个元素,41的第二个元素调换就可以。
    搞清楚了规律就easy实现了,中序遍历寻找逆序情况,调换的第一个元素,永远是第一个逆序的第一个元素,而调换的第二个元素假设仅仅有一次逆序,则是那一次的后一个,假设有两次逆序则是第二次的后一个。算法仅仅须要一次中序遍历,所以时间复杂度是O(n),空间是栈大小O(logn)。代码例如以下: 
    public void recoverTree(TreeNode root) {
        if(root == null)
            return;
        ArrayList<TreeNode> pre = new ArrayList<TreeNode>();
        pre.add(null);
        ArrayList<TreeNode> res = new ArrayList<TreeNode>();
        helper(root,pre, res);
        if(res.size()>0)
        {
            int temp = res.get(0).val;
            res.get(0).val = res.get(1).val;
            res.get(1).val = temp;
        }
    }
    private void helper(TreeNode root, ArrayList<TreeNode> pre, ArrayList<TreeNode> res)
    {
        if(root == null)
        {
            return;
        }
        helper(root.left, pre, res);
        if(pre.get(0)!=null && pre.get(0).val>root.val)
        {
            if(res.size()==0)
            {
                res.add(pre.get(0));
                res.add(root);
            }
            else
            {
                res.set(1,root);
            }
        }
        pre.set(0,root);
        helper(root.right,pre,res);
    }
    能够看到实现中pre用了一个ArrayList来存,这样做的原因是由于java都是值传递,所以我们要全局变化pre的值(而不是在当前函数里),仅仅能传一个数组,才干改变结点的地址,这一点很重要,也是java和C++一个比較大的差别,不了解的朋友能够研究一下哈。
    这道题还是考察二叉树遍历,只是应用题目要求套了一个不同的外壳,须要我们利用二叉查找树的性质观察出规律之后才干求解。
  • 相关阅读:
    C# 测试 modbusTCP 经验积累
    C#制作透明色GIF动画的类
    C# esc退出窗体
    让PPT演示文稿循环播放
    C# hex 转 float
    C# PowerPoint操作的基本用法。
    将listview的checkbox改成单选。
    google搜索栏设置
    如何在C++中实现Deprecated API Anthony
    只能用new生成的对象 Anthony
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4317200.html
Copyright © 2011-2022 走看看