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

    Two elements of a binary search tree (BST) are swapped by mistake.

    Recover the tree without changing its structure.

    Note:
    A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?

    solution 1 using O(n) space:

     1 /**
     2  * Definition for binary tree
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 public class Solution {
    11     public void recoverTree(TreeNode root) {
    12          ArrayList<TreeNode> Inorder = InOrderTraversal(root);
    13         int firstViolation = 0;
    14         int secondViolation = 0;
    15         int length = Inorder.size();
    16         if(!Inorder.isEmpty()){
    17             int i = 0;
    18             for(; i <length - 1; ++i){
    19                 if(Inorder.get(i).val > Inorder.get(i + 1).val){
    20                     firstViolation = i;
    21                     break;
    22                 }                    
    23             }
    24             ++i;
    25             for(; i < length - 1; ++i){
    26                 if(Inorder.get(i).val > Inorder.get(i + 1).val){
    27                     secondViolation = i + 1;
    28                     break;
    29                 }                    
    30             }
    31         }
    32         if(secondViolation == 0)
    33             secondViolation = firstViolation + 1;
    34         int temp = Inorder.get(firstViolation).val;
    35         Inorder.get(firstViolation).val = Inorder.get(secondViolation).val;
    36         Inorder.get(secondViolation).val = temp;        
    37     }
    38     public ArrayList<TreeNode> InOrderTraversal(TreeNode root){
    39         ArrayList<TreeNode> InOrder = new ArrayList<TreeNode>();
    40         if(root != null){
    41             if(root.left != null){
    42                 ArrayList<TreeNode> leftChild = InOrderTraversal(root.left);
    43                 InOrder.addAll(leftChild);
    44             }
    45             InOrder.add(root);
    46             if(root.right != null){
    47                 ArrayList<TreeNode> rightChild = InOrderTraversal(root.right);
    48                 InOrder.addAll(rightChild);
    49             }
    50         }
    51         return InOrder;
    52     }
    53 }

    Solution2: using O(1) extra space: 

     1 /**
     2  * Definition for binary tree
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 public class Solution {
    11     public void recoverTree(TreeNode root) {
    12         if(root != null){
    13             inOrder(root);
    14             int temp = firstViolation.val;
    15             firstViolation.val = secondViolation.val;
    16             secondViolation.val = temp;
    17         }
    18     }
    19     
    20     public void inOrder(TreeNode root){
    21         if(root != null){
    22             if(root.left != null)
    23                 inOrder(root.left);
    24             if(previous == null)
    25                 previous = root;
    26             else{
    27                 if(previous.val > root.val){
    28                     if(firstViolation == null)
    29                         firstViolation = previous;
    30                     secondViolation = root;                        
    31                 }
    32                 previous = root;
    33             }            
    34             if(root.right != null)
    35                 inOrder(root.right);
    36         }
    37     }    
    38     TreeNode previous = null;
    39     TreeNode firstViolation = null;
    40     TreeNode secondViolation = null;
    41 }
  • 相关阅读:
    美国常青小组:“4+2”,成功的企业的普遍特征
    与你的商业伙伴建立信任关系的12条准则
    成功12级跳:你还是穷人只因为你没有立下成为富人的目标
    生日与谁共
    猎取人心的36条黄金法则
    谢谢你能为我落泪
    要锤炼出营销魔法,口碑营销“无招胜有招”
    怎样成为下一个比尔·盖茨?总结决定他成功的几大要素
    只要你能够幸福
    史玉柱:创业不是靠忽悠,我的最后四个忠告
  • 原文地址:https://www.cnblogs.com/averillzheng/p/3536156.html
Copyright © 2011-2022 走看看