zoukankan      html  css  js  c++  java
  • 线性表,栈和队列都属于线性结构,而树,图属于非线性结构。

    宏观树

    • 每个节点有零个或多个子节点
    • 没有父节点的节点被称为根节点
    • 每个非根节点只能有一个父节点

    应用:层级的文件系统


    二叉树

    在树的基础上,增加限制条件:每个节点最多含有两个子节点。

    二叉树的三种遍历方式:

    • 先序遍历

      先访问根节点,然后访问左节点,最后访问右节点(根->左->右)

    • 中序遍历

      先访问左节点,然后访问根节点,最后访问右节点(左->根->右)

    • 后序遍历

      先访问左节点,然后访问右节点,最后访问根节点(左->右->根)


    二叉查找树

    在二叉树的基础上,增加限制条件:

    • 左子树节点的值 > 根节点的值 > 右子树节点的值(对于任意节点来说)
    • 没有键值相等的节点

    二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低为 O ( log ⁡ n ) 。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组等。


    平衡二叉树

    在二叉查找树的基础上,增加限制条件:每个节点的左子树和右子树高度差至多为1。


    红黑树

    在平衡二叉树的基础上,增加限制条件:

    • 每个节点有红色,黑色两种选项
    • 根节点和叶子节点必须是黑的
    • 如果一个节点是红的,那么它的两个儿子都是黑的(红子黑)
    • 任意节点到叶子节点NIL都包含相同数目的黑色节点

    红黑树是一种应用很广的数据结构,如在Java集合类中TreeSet和TreeMap的底层,C++STL中set与map,以及linux中虚拟内存的管理。


    哈夫曼树

    也称最优二叉树。

    最优体现在树的带权路径长度最小:(叶子节点的权值 和 叶子节点到根节点的路径长度的乘积 )*所有叶子节点

    哈夫曼树特征:权值小的节点远离根节点,权值大的节点靠近根节点。


    B树

    BTree也称为平衡多路查找树

    B-Tree是为磁盘等外存储设备设计的一种平衡查找树。

    1569143287075


    B+Tree

    B+Tree是在B-Tree基础上的一种优化

    • 非叶子结点只存储键值信息,不存储数据
    • 所有的叶子结点都有一个链指针
    • 数据记录都存放在叶子结点中

    1569143297523


    代码实现

    二叉树代码实现(递归)

    package com.company;
    
    public class BinaryTree {
    
        private BinaryTree  leftNode;
        private BinaryTree  rightNode;
        private Integer value;
    
        public BinaryTree(Integer value) {
            this.value = value;
        }
    
        public BinaryTree getLeftNode() {
            return leftNode;
        }
    
        public void setLeftNode(BinaryTree leftNode) {
            this.leftNode = leftNode;
        }
    
        public BinaryTree getRightNode() {
            return rightNode;
        }
    
        public void setRightNode(BinaryTree rightNode) {
            this.rightNode = rightNode;
        }
    
        public Integer getValue() {
            return value;
        }
    
        public void setValue(Integer value) {
            this.value = value;
        }
    
    
        //先序遍历
        public void preTraverseBTree(BinaryTree rootNode)
        {
    
            if(rootNode!=null)
            {
                System.out.println(rootNode.value);
    
                preTraverseBTree(rootNode.getLeftNode());
    
                preTraverseBTree(rootNode.getRightNode());
            }
        }
    
        //中序遍历
        public void inTraverseBTree(BinaryTree rootNode)
        {
    
            if(rootNode!=null) {
                inTraverseBTree(rootNode.getLeftNode());
    
                System.out.println(rootNode.value);
    
                inTraverseBTree(rootNode.getRightNode());
            }
        }
    
        //后序遍历
    
        public void afterTraverseBTree(BinaryTree rootNode)
        {
    
            if(rootNode!=null) {
                inTraverseBTree(rootNode.getLeftNode());
    
                inTraverseBTree(rootNode.getRightNode());
    
                System.out.println(rootNode.value);
            }
        }
        
    
        public static void main(String[] args) {
            BinaryTree node1 = new BinaryTree(1);
            BinaryTree node2 = new BinaryTree(2);
            BinaryTree node3 = new BinaryTree(3);
            BinaryTree node4 = new BinaryTree(4);
            BinaryTree node5 = new BinaryTree(5);
            BinaryTree node6 = new BinaryTree(6);
            BinaryTree node7 = new BinaryTree(7);
    
            node1.setLeftNode(node2);
            node1.setRightNode(node3);
    
            node2.setLeftNode(node4);
            node2.setRightNode(node5);
    
            node3.setLeftNode(node6);
            node3.setRightNode(node7);
    
            System.out.println("先序遍历:");
            node1.preTraverseBTree(node1);
    
            System.out.println("中序遍历:");
            node1.inTraverseBTree(node1);
    
            System.out.println("后序遍历:");
            node1.afterTraverseBTree(node1);
    
        }
    }
    
    

    动态创建二叉查找树

    参考:

    数据结构之树

  • 相关阅读:
    AspNet上传文件的几个控件(downmoon收集)
    简单的iframe无刷新上传带生产缩略图和水印
    js 操作frameset frame 对象
    C#里的三种定时器类型
    Asp.net上传图片同时生成缩略图和水印图后台代码
    .NET调用新浪微博开放平台接口的代码示例
    用 javascript 获取鼠标(光标)的坐标位置 兼容IE/Firefox等浏览器
    IIS Web服务扩展中没有Asp.net 2.0
    asp.net实现form验证登陆
    Asp.net实现在线截图(大图截取为小图)
  • 原文地址:https://www.cnblogs.com/noneplus/p/11815646.html
Copyright © 2011-2022 走看看