树状图是一种数据结构。由n(n>=1)个有限节点组成的一个具有层次关系的集合。
满二叉树:
像这种的,所有的叶子节点都是有的。不存在有空的树就是满二叉树。
完全二叉树:
这种的也是完全二叉树。只要是连贯的。没有断开的树都是完全二叉树。如果没有3的话。那他就不是完全二叉树了。
我们来看下代码: 链式结构的二叉树
先定义一个树。然后有一个根节点 root

1 /** 2 * 创建一个树。是链式的 3 */ 4 public class Tree { 5 TreeNode root; 6 7 public TreeNode getRoot() { 8 return root; 9 } 10 11 public void setRoot(TreeNode root) { 12 this.root = root; 13 } 14 }
然后定义树。因为是链式结构的。每一个节点都可能有左儿子和右儿子。所以定义一个左节点:leftNode 右节点:rightNode;

1 /** 2 * 创建一个树。这个树是链式结构的。 3 */ 4 public class TreeNode { 5 //树中链式结构的值。 6 int value; 7 //左儿子 8 TreeNode leftNode; 9 //右儿子 10 TreeNode rightNode; 11 12 public TreeNode(int value) { 13 this.value = value; 14 } 15 16 public int getValue() { 17 return value; 18 } 19 20 public void setValue(int value) { 21 this.value = value; 22 } 23 24 public TreeNode getLeftNode() { 25 return leftNode; 26 } 27 28 public void setLeftNode(TreeNode leftNode) { 29 this.leftNode = leftNode; 30 } 31 32 public TreeNode getRightNode() { 33 return rightNode; 34 } 35 36 public void setRightNode(TreeNode rightNode) { 37 this.rightNode = rightNode; 38 } 39 }
现在测试一下:

1 public class TestTree { 2 public static void main(String[] args) { 3 //创建一个树。 4 Tree tree = new Tree(); 5 //创建根节点 6 TreeNode treeNode = new TreeNode(1); 7 tree.setRoot(treeNode); 8 //创建左儿子 9 TreeNode LtreeNode = new TreeNode(2); 10 treeNode.setLeftNode(LtreeNode); 11 //左儿子再创建第三代的左儿子和右儿子 12 //创建左儿子的左儿子 13 TreeNode LLtreeNode = new TreeNode(4); 14 LtreeNode.setLeftNode(LLtreeNode); 15 //创建左儿子的右儿子 16 TreeNode RRtreeNode = new TreeNode(5); 17 LtreeNode.setRightNode(RRtreeNode); 18 //创建右儿子 19 TreeNode RtreeNode = new TreeNode(3); 20 treeNode.setRightNode(RtreeNode); 21 22 //创建右儿子的左儿子 23 TreeNode RLtreeNode = new TreeNode(6); 24 RtreeNode.setLeftNode(RLtreeNode); 25 //创建右儿子的右儿子 26 TreeNode RRRtreeNode = new TreeNode(7); 27 RtreeNode.setRightNode(RRRtreeNode); 28 } 29 }
这样就创建了一个这样的树。
现在树已经创建好了。我们来遍历一下。
前序遍历。就是先找自己,就是根,然后左节点,右节点。 先找1 ,然后该是2和3了。但是2和4 5又是一个小树(这里 用到了递归。自己调用自己。)。所以就去找4,5 然后是3 6 7 这个顺序是:1 2 4 5 3 6 7 .
中序遍历。把自己放到中间去找。先找左节点。然后就是自己。再就是右节点。 顺序是:4 2 5 1 6 3 7
后序遍历:把自己放到最后查找。现在左节点。右节点。自己 。顺序:4 5 2 6 7 3 1
我们看下代码:在TreeNode 类种。

1 //前遍历 2 public void frontShow(){ 3 //自己放在第一个进行遍历 4 System.out.print(value); 5 //左节点 6 if(leftNode!=null){ 7 leftNode.frontShow(); 8 } 9 //右节点 10 if (rightNode != null) { 11 rightNode.frontShow(); 12 } 13 } 14 15 //中遍历 16 public void midShow(){ 17 //左节点 18 if(leftNode!=null){ 19 leftNode.midShow(); 20 } 21 //自己放在中间进行遍历 22 System.out.print(value); 23 //右节点 24 if (rightNode != null) { 25 rightNode.midShow(); 26 } 27 } 28 29 //后遍历 30 public void afterShow(){ 31 //左节点 32 if(leftNode!=null){ 33 leftNode.afterShow(); 34 } 35 //右节点 36 if (rightNode != null) { 37 rightNode.afterShow(); 38 } 39 //自己放在最后进行遍历 40 System.out.print(value); 41 }
测试:

1 //前序遍历 2 treeNode.frontShow(); 3 System.out.println(); 4 //中序遍历 5 treeNode.midShow(); 6 System.out.println(); 7 //后序遍历 8 treeNode.afterShow(); 9 System.out.println();
结果:
我们看下查找一个节点:

1 //前序查找 2 public TreeNode frontSearch(int i) { 3 TreeNode treeNode = null; 4 //先和自己进行比较。如果值相同的话,就直接返回就行了。 5 if(this.value == i){ 6 return this; 7 } 8 //左儿子。和左节点进行比较。如果有左节点。然后去查找。 9 if(leftNode != null){ 10 treeNode = leftNode.frontSearch(i); 11 } 12 //返回的值不为null,就是找到了。 13 if(treeNode!=null){ 14 return treeNode; 15 } 16 //右儿子。左边的没有找到。找右边的。 17 if(rightNode!=null){ 18 treeNode = rightNode.frontSearch(i); 19 } 20 return treeNode; 21 }
我们看删除一个节点:
在链表类中的方法实现。

1 //删除。 2 public void delete(int i){ 3 //先判断要删除的是不是自己。 4 TreeNode deleteTreeNode = this; 5 //左叶子。 6 if(deleteTreeNode.leftNode!=null && deleteTreeNode.leftNode.value==i){ 7 deleteTreeNode.leftNode = null; 8 return; 9 } 10 //右叶子。 11 if(deleteTreeNode.rightNode!=null && deleteTreeNode.rightNode.value==i){ 12 deleteTreeNode.rightNode = null; 13 return; 14 } 15 //看看要删除的是不是左叶子的两个左右节点。 16 deleteTreeNode = leftNode; 17 if(deleteTreeNode != null){ 18 deleteTreeNode.delete(i); 19 } 20 deleteTreeNode = rightNode; 21 if(deleteTreeNode != null){ 22 deleteTreeNode.delete(i); 23 } 24 }
在树中的方法实现。

1 //删除 2 public void delete(int i) { 3 if(root.value == i){ 4 root = null; 5 }else { 6 root.delete(i); 7 } 8 }
测试:
1 //删除 2 tree.delete(2); 3 tree.frontShow();
显示前序遍历:
删除的是2:
删除5:
删除1: