BinarySortTree二叉树

  1 public class BinarySortTree<E extends Comparable<E>> {
  2     //根节点
  3     private Node root;
  4     private int size;  //0
  5 
  6     //添加操作
  7     public boolean add(E e){
  8         //判断root是否为null,若为null,则让新元素封装为节点称为root
  9         if (root==null){
 10             root = new Node(e);
 11             return true;
 12         }
 13         //若root不为null,尝试将新元素添加到root节点的左/右子树上
 14         return root.append(e);
 15     }
 16 
 17     //根据元素对象查找元素对应的节点对象
 18     public Node get(E e){
 19         //判断root是否为null,若为null,直接返回null
 20         if (root==null)
 21             return null;
 22         //若root不为null,则从root节点开始依次判断目标节点是否为要找的节点
 23         return root.get(e);
 24     }
 25 
 26     @Override
 27     public String toString() {
 28         //判断root是否为null,若为null,返回[]
 29         if (root==null)
 30             return "[]";
 31         //若root不为null,则对二叉排序树进行中序遍历,将元素拼接成字符串返回,元素之间用,分割
 32         StringBuilder builder = new StringBuilder("[");
 33         //对二叉排序树进行中序遍历
 34         builder = root.midOrder(builder); //[1,2,3,4]
 35         //将builder最后的,去掉
 36         return builder.deleteCharAt(builder.length()-1).append("]").toString();
 37     }
 38 
 39     //创建内部类 表示节点对象
 40     private  class Node{
 41         private E data;
 42         private Node left;
 43         private Node right;
 44 
 45         Node(E e){
 46             data = e;
 47         }
 48 
 49         //向该节点添加元素,成为其左/右子树
 50         public boolean append(E e) {
 51             //判断e是否和当前节点元素值相等,若相等,添加失败,返回false
 52             if (e.compareTo(data)==0)
 53                 return false;
 54                 //若不相等,则判断是大于,还是小于
 55             else if (e.compareTo(data)>0){
 56                 //添加到右子树
 57                 if (right==null) {
 58                     right = new Node(e);
 59                     return true;
 60                 }
 61                 return right.append(e);
 62             }else{  //e小于节点的元素,向左子树添加
 63                 if (left==null){
 64                     left = new Node(e);
 65                     return true;
 66                 }else {
 67                     return left.append(e);
 68                 }
 69             }
 70         }
 71 
 72         //中序遍历,将遍历到的元素拼接到builder对象中
 73         public StringBuilder midOrder(StringBuilder builder) {
 74             //遍历左子树
 75             if (left!=null)
 76                 left.midOrder(builder);
 77             //取到根节点元素的值并拼接
 78             builder.append(data).append(",");
 79             //遍历右子树
 80             if (right!=null)
 81                 right.midOrder(builder);
 82             return builder;
 83         }
 84 
 85         //该用于用于判断目标节点是否为要找的节点
 86         public Node get(E e) {
 87             //判断当前节点的元素是否与e相同,若相同,则返回当前节点
 88             if (e.compareTo(data)==0)
 89                 return this;
 90                 //若不相等,则判断大小
 91             else  if (e.compareTo(data)>0){
 92                 //到右子树去找
 93                 if (right==null)
 94                     return null;
 95                 return right.get(e);
 96             }else {  //e小于当前节点,到左子树去查找
 97                 if (left==null)
 98                     return null;
 99                 return left.get(e);
100             }
101         }
102 
103         @Override
104         public String toString() {
105             return "Node{" +
106                     "data=" + data +
107                     ", left=" + left +
108                     ", right=" + right +
109                     '}';
110         }
111     }
112 }

 

posted @ 2021-09-22 20:31  牵你不解释  阅读(36)  评论(0)    收藏  举报