1 package iYou.neugle.tree; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Binary_Tree<T> { 7 private Tree tree = new Tree(); 8 9 class Tree { 10 public T data; 11 public Tree left; 12 public Tree right; 13 } 14 15 public enum Direction { 16 left, right 17 } 18 19 // 生成根节点 20 public void CreateRoot(T data) { 21 this.tree.data = data; 22 } 23 24 // 插入节点到指定位置 25 public boolean Insert(T parentData, T data, Direction direction) { 26 if (this.TreeIsEmpty()) { 27 System.out.println("树暂无节点,请先创建树"); 28 return false; 29 } 30 return this.InsertNode(this.tree, parentData, data, direction); 31 } 32 33 private boolean InsertNode(Tree TreeNode, T parentData, T data, 34 Direction direction) { 35 if (TreeNode == null) { 36 return false; 37 } 38 if (TreeNode.data.equals(parentData)) { 39 Tree t = new Tree(); 40 t.data = data; 41 if (direction == Direction.left) { 42 if (TreeNode.left == null) { 43 TreeNode.left = t; 44 return true; 45 } else { 46 System.out.println("该节点的左节点不为空!"); 47 } 48 } else { 49 if (TreeNode.right == null) { 50 TreeNode.right = t; 51 return true; 52 } else { 53 System.out.println("该节点的右节点不为空!"); 54 } 55 } 56 return false; 57 } 58 59 boolean b = InsertNode(TreeNode.left, parentData, data, direction); 60 61 if (!b) { 62 return InsertNode(TreeNode.right, parentData, data, direction); 63 } else { 64 return b; 65 } 66 67 } 68 69 // 获取二叉树深度 70 public int Deep() { 71 return this.TreeDeep(this.tree); 72 } 73 74 private int TreeDeep(Tree tree) { 75 int leftLen = 0; 76 int rightLen = 0; 77 if (tree == null) { 78 return 0; 79 } 80 leftLen = this.TreeDeep(tree.left); 81 rightLen = this.TreeDeep(tree.right); 82 if (leftLen > rightLen) { 83 return leftLen + 1; 84 } else { 85 return rightLen + 1; 86 } 87 } 88 89 // 判断二叉树是否为空 90 public boolean TreeIsEmpty() { 91 if (this.tree.data != null) { 92 return false; 93 } 94 return true; 95 } 96 97 // 根据值查找节点 98 public Tree Query(T data) { 99 return QueryTreeByValue(this.tree, data); 100 } 101 102 private Tree QueryTreeByValue(Tree tree, T data) { 103 if (tree == null) { 104 return null; 105 } 106 if (tree.data.equals(data)) { 107 System.out.println("----------"); 108 System.out.println("查找到该节点,节点左子树为:" 109 + (tree.left == null ? "无" : tree.left.data)); 110 System.out.println("查找到该节点,节点右子树为:" 111 + (tree.right == null ? "无" : tree.right.data)); 112 System.out.println("----------"); 113 return tree; 114 } 115 Tree t = QueryTreeByValue(tree.left, data); 116 if (t == null) { 117 return QueryTreeByValue(tree.right, data); 118 } else { 119 return t; 120 } 121 } 122 123 // 清空二叉树 124 public void ClearTree() { 125 this.tree = null; 126 } 127 128 // 先序遍历 129 public void DLR() { 130 this.Tree_DLR(this.tree); 131 } 132 133 private void Tree_DLR(Tree tree) { 134 if (tree == null) { 135 return; 136 } 137 System.out.println(tree.data); 138 this.Tree_DLR(tree.left); 139 this.Tree_DLR(tree.right); 140 } 141 142 // 中序遍历 143 public void LDR() { 144 this.Tree_LDR(this.tree); 145 } 146 147 private void Tree_LDR(Tree tree) { 148 if (tree == null) { 149 return; 150 } 151 this.Tree_LDR(tree.left); 152 System.out.println(tree.data); 153 this.Tree_LDR(tree.right); 154 } 155 156 // 后序遍历 157 public void LRD() { 158 this.Tree_LRD(this.tree); 159 } 160 161 private void Tree_LRD(Tree tree) { 162 if (tree == null) { 163 return; 164 } 165 this.Tree_LRD(tree.left); 166 this.Tree_LRD(tree.right); 167 System.out.println(tree.data); 168 } 169 170 // 层次遍历 171 public void Level() { 172 List<Tree> list = new ArrayList<Tree>(); 173 list.add(this.tree); 174 while (!list.isEmpty()) { 175 Tree left = list.get(0).left; 176 Tree right = list.get(0).right; 177 if (left != null) { 178 list.add(left); 179 } 180 if (right != null) { 181 list.add(right); 182 } 183 System.out.println(list.get(0).data); 184 list.remove(0); 185 } 186 } 187 }