zoukankan      html  css  js  c++  java
  • Java实现 LeetCode 99 恢复二叉搜索树

    99. 恢复二叉搜索树

    二叉搜索树中的两个节点被错误地交换。

    请在不改变其结构的情况下,恢复这棵树。

    示例 1:

    输入: [1,3,null,null,2]

       1
      /
     3
      
       2
    

    输出: [3,1,null,null,2]

       3
      /
     1
      
       2
    

    示例 2:

    输入: [3,1,4,null,null,2]

      3
     / 
    1   4
       /
      2
    

    输出: [2,1,4,null,null,3]

      2
     / 
    1   4
       /
      3
    

    进阶:

    使用 O(n) 空间复杂度的解法很容易实现。
    你能想出一个只使用常数空间的解决方案吗?

    PS:

    中序遍历过程中,记录错误两个错误排序节点,最后进行交换
    只需要中序遍历一遍就可以了

    首先我们来看中序遍历过程模板

    public void inorder(TreeNode root){
            if (root == null) return ;    //终止条件
            inorder(root.left);           //访问左子树
            对当前节点进行一些操作          //访问根节点-----在遍历过程中希望实现的操作
            inorder(root.right);          //访问右子树
        }
    

    另一方面我们知道 对二叉搜索树进行 中序遍历的时候 访问到的元素是从小到大顺序排列的
    如我们对实例 2 恢复好的树 进行中序遍历 得到的应该是 1 2 3 4

    那这道题我们就有了大致思路
    我们对错误的二叉树进行 中序遍历 那我们按顺序访问到的数应该是按顺序排列的
    那如果对两个节点交换了顺序 那一定有两个地方是 不满足 前一个元素 < 当前元素 < 后一个元素
    如示例2 3 1 4 2:
    3 这个节点不满足 1 这个节点不满足
    所以我们使用两个全局变量在遍历过程中记录这两个节点 最后对他们进行交换

     
    class Solution {
    
     
        TreeNode t1, t2, pre;
        public void recoverTree(TreeNode root) {
            inorder(root);
            int temp = t1.val;
            t1.val = t2.val;
            t2.val = temp;
        }
        public void inorder(TreeNode root){
            if (root == null) return ;
            inorder(root.left);
            if (pre != null && pre.val > root.val) {
                if (t1 == null) t1 = pre;
                t2 = root;
            }
            pre = root;
            inorder(root.right);
        }
    }
    
  • 相关阅读:
    2018.11.5 Nescafe26 T1 小猫爬山
    2018.10.30 NOIp模拟赛T2 数字对
    2018.10.30 NOIp模拟赛 T1 改造二叉树
    2018/7/16 YMOI模拟 NOIP2013D2T3华容道
    数据结构实验
    我的第一个博客
    题解 P5035 【金坷垃】
    题解 P5036 【随机生成树】
    题解 P5037 【抓捕】
    题解 P1328 【生活大爆炸版石头剪刀布】
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12946813.html
Copyright © 2011-2022 走看看