• 二叉树


    =======================树========================
    特点:
        1.由n个节点组成的有限集合。每个节点的前驱节点和后继节点都可能不止一个。
        2.非空的树有且只有一个根节点。
        3.除根节点外,其余节点可分为若干个互不相交的子集。每个子集本身又构成一棵树,称为根的子树。
        4.一个节点拥有的子树的数量称为该节点的度。所有节点的最大度数称为树的度。节点总数 = 度的总数 + 1。
        5.度数为0的节点称为叶节点。
        6.节点处于树当中的位置,称为层。根节点的层数为0,其他节点的层数在父节点的层数上加1。
        7.同一节点的孩子,称为兄弟节点。同一层次的,不同父节点的节点,称为堂兄弟。
        8.从根到任意节点存在唯一的路径,路径的长度描述了树节点层数。
        9.树的根节点到树的叶节点的最长路径的长度,称树的高或树的深。
        10.如果树的各节点的子树从左到右是有序的,称为有序树。度数为m的有序树。称为m叉树。
        
    =======================二叉树=====================
    特点:
        1.每个节点的度数均不超过2
        2.有序树
        3.节点的子树有左右之分
        4.在第i层上,最多有2的i次方个节点。
        5.叶节点数n0,度数为2的节点数n2,则n0=n2+1
        6.高度为h的二叉树最多有2的(h+1)次方减1个节点
        
    满二叉树:每层的节点都达到了最大值

    完全二叉树:满二叉树的最下层从右到左连续删除若干个子节点形成的二叉树

    存储结构:顺序存储和链式存储
    1.顺序存储:
        1.只适合满二叉树和完全二叉树
        2.用序号随机访问二叉树中的节点
        3.存储位置:
            如果把完全二叉树的第i个节点存储在数组的第i个元素中。那么,它的父节点存储在i/2个位置,左子节点存储在2i个位置,右子节点存储在2i+1个位置。
            如果i是奇数,i/2取整,这里不能四舍五入。
            
    2.链式存储(二叉链表):
        1.非满二叉树,也不是完全二叉树。描述数据元素之间关系不是存储地址的相对位置而是指针
        2.数据域(数据元素)、左孩子域(左指针)、右孩子域(右指针)
        
    范例:
    1.节点类 - TreeNode

     1 /**
     2  * @Description: 树的节点
     3  * @author Ivy
     4  */
     5 public class TreeNode {
     6 
     7     private Object nodeValue;
     8     private TreeNode left, right;
     9 
    10     public TreeNode() {
    11         this(null, null, null);
    12     }
    13 
    14     public TreeNode(Object item, TreeNode left, TreeNode right) {
    15         this.nodeValue = item;
    16         this.left = left;
    17         this.right = right;
    18     }
    19 
    20     public TreeNode(Object item) {
    21         this(item,null,null);
    22     }
    23     
    24     /**
    25      * @Description: 判断当前节点是否是叶节点
    26      * @return
    27      */
    28     public boolean isLeaf(){
    29         if (this.left == null && this.right == null) {
    30             return true;
    31         } else {
    32             return false;
    33         }
    34     }
    35     
    36     public String toString(){
    37         if (nodeValue == null) {
    38             return null;
    39         }
    40         String result = "(节点" + nodeValue.toString();
    41         if (left != null) {
    42             result += "左子树:" + left.toString();
    43         }
    44         if (right != null) {
    45             result += "右子树:" + right.toString();
    46         }
    47         result += ")";
    48         return result;
    49     }
    50 
    51 }


    2.实现二叉树 - BinaryTree

     1 /**
     2  * @Description: 实现二叉树
     3  * @author Ivy
     4  */
     5 public class BinaryTree {
     6 
     7     protected TreeNode root;
     8 
     9     public BinaryTree() {
    10         root = null;
    11     }
    12 
    13     public BinaryTree(TreeNode root) {
    14         this.root = root;
    15     }
    16     
    17     public boolean isEmpty() {
    18         return this.root == null;
    19     }
    20     
    21     public TreeNode getRoot() {
    22         return this.root;
    23     }
    24     
    25     public String toString() {
    26         return this.root.toString();
    27     }
    28 }


    3.构造二叉树 - BuildTree

     1 /**
     2  * @Description: 构造二叉树
     3  * @author Ivy
     4  */
     5 public class BuildTree {
     6 
     7     /**
     8      *             a
     9      *           /      
    10      *          b       c
    11      *         /  
    12      *        d    e
    13      *            / 
    14      *           f      g    
    15      */
    16     
    17     public static BinaryTree create() {
    18         TreeNode a,b,c,d,e,f,g;
    19         f = new TreeNode("F");
    20         g = new TreeNode("G");
    21         d = new TreeNode("D");
    22         e = new TreeNode("E",f,g);
    23         b = new TreeNode("B",d,e);
    24         c = new TreeNode("C");
    25         a = new TreeNode("A",b,c);
    26         return new BinaryTree(a);
    27         
    28     }
    29 }




  • 相关阅读:
    Hibernate 小章总结(三)
    河北民间组织管理系统软件
    《编写有效用例阅读笔记二》
    《编写有效用例》读后感(一)
    专业实训需求分析
    2015秋季个人阅读计划
    大道至简阅读笔记之三
    大道至简阅读笔记之二
    大道至简阅读笔记之一
    程序员修炼之道阅读笔记之二
  • 原文地址:https://www.cnblogs.com/ivy-xu/p/5751686.html
Copyright © 2020-2023  润新知