树状图是一种数据结构。由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 }
View Code

 然后定义树。因为是链式结构的。每一个节点都可能有左儿子和右儿子。所以定义一个左节点: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 }
View Code

现在测试一下:

 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 }
View Code

这样就创建了一个这样的树。

现在树已经创建好了。我们来遍历一下。

前序遍历。就是先找自己,就是根,然后左节点,右节点。  先找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     }
View Code

测试:

1  //前序遍历
2         treeNode.frontShow();
3         System.out.println();
4         //中序遍历
5         treeNode.midShow();
6         System.out.println();
7         //后序遍历
8         treeNode.afterShow();
9         System.out.println();
View Code

结果:

我们看下查找一个节点:

 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     }
View Code

我们看删除一个节点:

在链表类中的方法实现。

 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     }
View Code

在树中的方法实现。

1  //删除
2     public void delete(int i) {
3         if(root.value == i){
4             root = null;
5         }else {
6             root.delete(i);
7         }
8     }
View Code

测试:

1 //删除
2         tree.delete(2);
3         tree.frontShow();

显示前序遍历:

删除的是2:

删除5:

删除1:

 

posted @ 2018-11-14 14:19  陆伟  阅读(360)  评论(0编辑  收藏  举报