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

  • 相关阅读:
    HttpServletResponse对锂
    搭建java Web项目开发环境(一)
    React Native动画-Animated
    React-Navigation redux集成
    react-navigation 使用详解
    echart
    io-输出流
    react-native-lesson
    集合类-HashSet去重
    kafka不同主题使用同一个group.id的坑
  • 原文地址:https://www.cnblogs.com/bulrush/p/9957741.html
Copyright © 2020-2023  润新知