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 }