zoukankan      html  css  js  c++  java
  • 树状图是一种数据结构。由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:

  • 相关阅读:
    97. Interleaving String
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    94. Binary Tree Inorder Traversal
    odoo many2many字段 指定打开的form视图
    docker sentry 配置文件位置
    postgres 计算时差
    postgres 字符操作补位,字符切割
    postgres判断字符串是否为时间,数字
    odoo fields_view_get
  • 原文地址:https://www.cnblogs.com/bulrush/p/9957741.html
Copyright © 2011-2022 走看看