zoukankan      html  css  js  c++  java
  • 第4章 树

     二叉查找树

      1 public class BinarySearchTree<AnyType extends Comparable<? super AnyType>>
      2 {
      3     private static class BinaryNode<AnyType> 
      4     {
      5         BinaryNode(AnyType theElement) 
      6         {
      7             this(theElement, null, null);
      8         }
      9 
     10         BinaryNode(AnyType theElement, BinaryNode<AnyType> lt, BinaryNode<AnyType> rt) 
     11         {
     12             element = theElement;
     13             left = lt;
     14             right = rt;
     15         }
     16 
     17         AnyType element;
     18         BinaryNode<AnyType> left;
     19         BinaryNode<AnyType> right;
     20     }
     21 
     22     private BinaryNode<AnyType> root;
     23 
     24     public BinarySearchTree() 
     25     {
     26         root = null;
     27     }
     28 
     29     public void makeEmpty() 
     30     {
     31         root = null;
     32     }
     33 
     34     public boolean isEmpty() 
     35     {
     36         return root == null;
     37     }
     38 
     39     public boolean contains(AnyType x)
     40     { return contains(x, root); }
     41     public AnyType findMin()
     42     {
     43         if (isEmpty()) throw new UnderflowException();
     44         return findMin(root).element;
     45     }
     46     public AnyType findMax()
     47     {
     48         if (isEmpty()) throw new UnderflowException();
     49         return findMax(root).element;
     50     }
     51     public void insert(AnyType x)
     52     {
     53         root = insert(x, root);
     54     }
     55     public void remove(AnyType x)
     56     {
     57         root = remove(x, root);
     58     }
     59 
     60     private boolean contains(AnyType x, BinaryNode<AnyType> t)
     61     {
     62         if (t == null)
     63             return false;
     64 
     65         int compareResult = x.compareTo(t.element);
     66 
     67         if (compareResult < 0)
     68             return contains(x, t.left);
     69         if (compareResult > 0)
     70             return contains(x, t.right);
     71         else
     72             return true;
     73     }
     74 
     75     private BinaryNode<AnyType> findMin(BinaryNode<AnyType> t)
     76     {
     77         if (t == null)
     78             return null;
     79         else if (t.left == null)
     80             return t;
     81         return findMin(t.left);
     82     }
     83 
     84     private BinaryNode<AnyType> findMax(BinaryNode<AnyType> t) 
     85     {
     86         if (t != null)
     87             while (t.right != null)
     88                 t = t.right;
     89 
     90         return t;
     91     }
     92 
     93     private BinaryNode<AnyType> insert(AnyType x, BinaryNode<AnyType> t)
     94     {
     95         if (t == null)
     96             return new BinaryNode<>(x, null, null);
     97 
     98         int compareResult = x.compareTo(t.element);
     99 
    100         if (compareResult < 0)
    101             t.left = insert(x, t.left);
    102         if (compareResult > 0)
    103             t.right = insert(x, t.right);
    104         else
    105             ;
    106         return t;
    107     }
    108 
    109     private BinaryNode<AnyType> remove(AnyType x, BinaryNode<AnyType> t)
    110     {
    111         if (t == null)
    112             return t;
    113 
    114         int compareResult = x.compareTo(t.element);
    115 
    116         if (compareResult < 0)
    117             t.left = remove(x, t.left);
    118         else if (compareResult > 0)
    119             t.right = remove(x, t.right);
    120         else if (t.left != null && t.right != null)
    121         {
    122             t.element = findMin(t.right).element;
    123             t.right = remove(t.element, t.right);
    124         }
    125         else
    126             t = (t.left != null) ? t.left : t.right;
    127         return t;
    128     }
    129 
    130     public void printTree()
    131     {
    132         if (isEmpty())
    133             System.out.println("Empty tree");
    134         else
    135             printTree(root);
    136     }
    137 
    138     public void printTree(BinaryNode<AnyType> t)
    139     {
    140         if (t != null)
    141         {
    142             printTree(t.left);
    143             System.out.println(t.element);
    144             printTree(t.right);
    145         }
    146     }
    147 }
    1 public class UnderflowException extends RuntimeException {
    2 }

    懒惰删除:当一个元素要被删除时,它仍留在树中,而只是被标记为删除。

    AVL树

      1 public class AvlTree<AnyType extends Comparable<? super AnyType>>
      2 {
      3     public AvlTree() { root = null; }
      4     
      5     public void insert(AnyType x){ root = insert(x, root); }
      6     public void remove(AnyType x){ root = remove(x, root); }
      7     
      8     private AvlNode<AnyType>remove(AnyType x, AvlNode<AnyType> t)
      9     {
     10         if (t == null)
     11             return t;
     12         
     13         int compareResult = x.compareTo(t.element);
     14         
     15         if (compareResult < 0)
     16             t.left = remove(x, t.left);
     17         else if (compareResult > 0)
     18             t.right = remove(x, t.right);
     19         else if (t.left != null && t.right != null)
     20         {
     21             t.element = findMin(t.right).element;
     22             t.right = remove(t.element, t.right);
     23         }
     24         else 
     25             t = (t.left != null) ? t.left : t.right;
     26         return balance(t);
     27     }
     28     
     29     public AnyType findMin()
     30     {
     31         if (isEmpty())
     32             throw new UnderflowException();
     33         return findMin(root).element;
     34     }
     35     
     36     public AnyType findMax()
     37     { 
     38         if (isEmpty())
     39             throw new UnderflowException();
     40         return findMin(root).element;
     41     }
     42     
     43     public boolean contains(AnyType x){ return contains(x, root); }
     44     
     45     public void makeEmpty(){ root = null; }
     46     
     47     public boolean isEmpty(){ return root == null; }
     48     
     49     public void printTree()
     50     {
     51         if (isEmpty())
     52             System.out.println("Empty tree");
     53         else 
     54             printTree(root);
     55     }
     56     
     57     private static final int ALLOWED_IMBALANCE = 1;
     58     
     59     private AvlNode<AnyType>balance(AvlNode<AnyType>t)
     60     {
     61         if (t == null)
     62             return t;
     63      
     64         if (height(t.left) - height(t.right) > ALLOWED_IMBALANCE)
     65             if (height(t.left.left) - height(t.left.right) > ALLOWED_IMBALANCE)
     66                 t = rotateWithLeftChild(t);
     67             else 
     68                 t = doubleWithLeftChild(t);
     69         
     70         if (height(t.right) - height(t.left) > ALLOWED_IMBALANCE)
     71             if (height(t.right.right) - height(t.right.left) > ALLOWED_IMBALANCE)
     72                 t = rotateWithRightChild(t);
     73             else 
     74                 t = doubleWithRightChild(t);
     75             
     76         t.height = Math.max(height(t.left), height(t.right)) + 1;
     77         return t;
     78     }
     79     
     80     public void checkBalance(){ checkBalance(root); }
     81     
     82     private int checkBalance(AvlNode<AnyType> t)
     83     { 
     84         if (t == null)
     85             return -1;
     86         
     87         if (t != null)
     88         {
     89             int hl = checkBalance(t.left);
     90             int hr = checkBalance(t.right);
     91             if (Math.abs(height(t.left) - height(t.right)) > 1 || height(t.left) != hl || height(t.right) != hr)
     92                 System.out.println("OOPS");
     93         }
     94         
     95         return height(t);
     96     }
     97     
     98     private AvlNode<AnyType> insert(AnyType x, AvlNode<AnyType>t)
     99     {
    100         if (t == null)
    101             return new AvlNode<>(x, null, null);
    102         
    103         int compareResult = x.compareTo(t.element);
    104         
    105         if (compareResult < 0)
    106             t.left = insert(x, t.left);
    107         else if (compareResult > 0)
    108             t.right = insert(x, t.right);
    109         else 
    110             ;
    111         return balance(t);
    112     }
    113     private AvlNode<AnyType> findMin(AvlNode<AnyType> t)
    114     {
    115         if (t == null)
    116             return t;
    117         while (t.left != null)
    118             t = t.left;
    119 
    120         return t;
    121     }
    122 
    123     private AvlNode<AnyType>findMax(AvlNode<AnyType> t)
    124     {
    125         if (t == null)
    126             return t;
    127         while (t.right != null)
    128             t = t.right;
    129 
    130         return t;
    131     }
    132     private boolean contains(AnyType x, AvlNode<AnyType> t)
    133     {
    134         while (t != null)
    135         {
    136             int compareResult = x.compareTo(t.element);
    137             if (compareResult < 0)
    138                 t = t.left;
    139             else if (compareResult > 0)
    140                 t = t.right;
    141             else
    142                 return true;
    143         }
    144         return false;
    145     }
    146 
    147     private void printTree(AvlNode<AnyType> t)
    148     {
    149         if (t != null)
    150         {
    151             printTree(t.left);
    152             System.out.println(t.element);
    153             printTree(t.right);
    154         }
    155     }
    156 
    157     private int height(AvlNode<AnyType> t){ return t == null ? -1 : t.height; }
    158     
    159     private AvlNode<AnyType> rotateWithLeftChild(AvlNode<AnyType> k2)
    160     {
    161         AvlNode<AnyType>k1 = k2.left;
    162         k2.left = k1.right;
    163         k1.right = k2;
    164         k2.height = Math.max(height(k2.left), height(k2.right)) + 1;
    165         k1.height = Math.max(height(k1.left), k2.height) + 1;
    166         return k1;
    167     }
    168     
    169     private AvlNode<AnyType> rotateWithRightChild(AvlNode<AnyType>k1)
    170     {
    171         AvlNode<AnyType>k2 = k1.right;
    172         k1.right = k2.left;
    173         k2.left = k1;
    174         k1.height = Math.max(height(k1.left), height(k1.right)) + 1;
    175         k2.height = Math.max(height(k2.right), k1.height) + 1;
    176         return k2;
    177     }
    178     
    179     private AvlNode<AnyType>doubleWithLeftChild(AvlNode<AnyType> k3)
    180     {
    181         k3.left = rotateWithRightChild(k3.left);
    182         return rotateWithLeftChild(k3);
    183     }
    184     
    185     private AvlNode<AnyType>doubleWithRightChild(AvlNode<AnyType>k1)
    186     {
    187         k1.right = rotateWithLeftChild(k1.right);
    188         return rotateWithRightChild(k1);
    189     }
    190 
    191     private static class AvlNode<AnyType>
    192     {
    193         AvlNode(AnyType theElement)
    194         { this(theElement, null, null); }
    195         AvlNode(AnyType theElement, AvlNode<AnyType>lt, AvlNode<AnyType>rt)
    196         { element = theElement; left = lt; right = rt; height = 0; }
    197 
    198         AnyType element;
    199         AvlNode<AnyType> left;
    200         AvlNode<AnyType> right;
    201         int height;
    202     }
    203 
    204     private AvlNode<AnyType> root;
    205 }

    4.10 编写一个程序,该程序列出一个目录中所有的文件和大小

     1 import java.io.File;
     2 
     3 public class FileList
     4 {
     5     public void list(File f)
     6     {
     7         list(f, 0);
     8     }
     9 
    10     public void list(File f, int depth)
    11     {
    12         printName(f, depth);
    13         if (f.isDirectory())
    14         {
    15             File[] files = f.listFiles();
    16             for (File i : files)
    17                 list(i, depth + 1);
    18         }
    19     }
    20 
    21     void printName(File f, int depth)
    22     {
    23         String name = f.getName();
    24         for (int i = 0; i < depth; i++)
    25             System.out.print("      ");
    26         if (f.isDirectory())
    27             System.out.println("Dir: " + name);
    28         else
    29             System.out.println(f.getName() + " " + f.length());
    30     }
    31 }
  • 相关阅读:
    14
    12
    11
    js 元素实现全屏和退出全屏功能
    iOS开发之使用苹果测试工具TestFlight(进行内部和外部测试)
    iOS开发之使用fastlane工具实现自动化打包发布
    iOS开发之使用MQTT协议实现远程通讯
    iOS项目功能模块封装SDK使用总结
    iOS技术之SDK开发注意事项
    iOS开发之登录注册系统
  • 原文地址:https://www.cnblogs.com/tjj-love-world/p/10556768.html
Copyright © 2011-2022 走看看