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);
    
        }
    }
    
    

    动态创建二叉查找树

    参考:

    数据结构之树

  • 相关阅读:
    POJ 1426 Find The Multiple(数论——中国同余定理)
    POJ 2253 Frogger(Dijkstra变形——最短路径最大权值)
    POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)
    POJ 3278 Catch That Cow(模板——BFS)
    HDU 1071 The area
    HDU 1213 How Many Tables(模板——并查集)
    POJ 1611 The Suspects
    light oj 1214 Large Division
    POJ 1258 Agri-Net(Prim算法求解MST)
    POJ 2387 Til the Cows Come Home(模板——Dijkstra算法)
  • 原文地址:https://www.cnblogs.com/noneplus/p/11815646.html
Copyright © 2011-2022 走看看