手写二叉树

二叉树和双向循环链表的结构几乎一样,难点在于添加元素和遍历的时候,我们要用到递归,所以小伙伴们可以用debug走一遍,这样就能清楚看到元素存放和遍历的过程了。

直接上代码:

 1 public class Tree<E extends Comparable<E>> {//二叉树中的元素必须是可比较的
 2     //根节点
 3     private Node root;
 4     //元素个数
 5     private int size;
 6 
 7     private class Node {
 8         //和双向循环链表一样,我们只是把前后换成了左右
 9         E data;
10         Node left;
11         Node right;
12 
13         public Node(E e) {
14             data = e;
15         }
16         //增加子元素的方法,由父元素调用
17         private boolean addChild(E e) {
18             //父节点的值与要添加进来的节点的值进行比较
19             int val = data.compareTo(e);
20             //一样大咱就加不进来,因为二叉树是左小右大的,咱一定要比出大小的
21             if (val == 0) {
22                 return false;
23             } else if (val > 0) {//如果data更大,也就是即将要加进来的E e更小,那么往左半支放
24                 //左边要是空的
25                 if (left == null) {
26                     //新节点直接成为左支
27                     left = new Node(e);
28                     size++;
29                     return true;
30                 } else {
31                     //如果左边本来就有节点,那么新节点暂时还放不下来,我们递归调用left的addChild()
32                     //方法,让新节点的值e与left的值去比较,直到新节点加进来
33                     return left.addChild(e);
34                 }
35             } else {//右侧同左侧
36                 if (right == null) {
37                     right = new Node(e);
38                     size++;
39                     return true;
40                 } else {
41                     return right.addChild(e);
42                 }
43             }
44         }
45         
46         //按照左中右的顺序遍历二叉树
47         private void appendTo(StringBuilder buf) {
48             if (left != null) {
49                 left.appendTo(buf);
50             }
51             buf.append(data).append(",");
52             if (right != null) {
53                 right.appendTo(buf);
54             }
55         }
56     }
57 
58         public boolean add(E e) {
59             if (root == null) {
60                 root = new Node(e);
61                 size++;
62                 return true;
63             } else {
64                 return root.addChild(e);
65             }
66         }
67         
68         public String toString() {
69             if(root == null) {
70                 return "[]";
71             }
72             StringBuilder buf = new StringBuilder("[");
73             root.appendTo(buf);
74             //删掉最后一个多余的逗号
75             buf.delete(buf.lastIndexOf(","), buf.length());
76             return buf.append("]").toString();
77         }
78     
79 }

 

posted @ 2019-07-29 15:23  resuscitate  阅读(421)  评论(0编辑  收藏  举报