手写二叉树
二叉树和双向循环链表的结构几乎一样,难点在于添加元素和遍历的时候,我们要用到递归,所以小伙伴们可以用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 }