zoukankan      html  css  js  c++  java
  • 第6章 树和二叉树

    序言

    为什么需要树结构?

    1.数组存储方式的分析

    优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。

    缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低。

    2.链式存储方式的分析

    优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。

    缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历) 。

    3.树存储方式的分析

    能提高数据存储,读取的效率, 比如利用二叉排序树(Binary Sort Tree),既可以保证数据的检索速度,同时也可以保证数据的插入,删除,修改的速度。

    树的概述

    树的存储

    树的顺序存储

    顺序存储二叉树应用实例

    八大排序算法中的堆排序,就会使用到顺序存储二叉树, 关于堆排序,我们放在<<树结构实际应用>> 章节讲解

    先序遍历、中序遍历、后序遍历

    线索二叉树

    树的链式存储

    先序遍历、中序遍历、后序遍历

    二叉树

    二叉查找树是一种查找效率非常高的数据结构,它有三个特点。

    1. 每个节点最多只有两个子树。
    2. 左子树都为小于父节点的值,右子树都为大于父节点的值。(左<父<右)
    3. 在n个节点中找到目标值,一般只需要log(n)次比较。

    二叉查找树的结构不适合数据库,因为它的查找效率与层数相关。越处在下层的数据,就需要越多次比较。极端情况下,n个数据需要n次比较才能找到目标值。

    对于数据库来说,每进入一层,就要从硬盘读取一次数据,这非常致命,因为硬盘的读取时间远远大于数据处理时间,数据库读取硬盘的次数越少越好。

    树的遍历

    1.广度优先遍历——Queue

    从根节点开始,沿着树的宽度依次遍历树的每个节点。

    我们借助队列结构来实现树的广度优先遍历。上图的遍历结果为:ABCDEFG

    Queue<Node> queue = new LinkedBlockingQueue<Node>();
    List<Node> result = new ArrayList<Node>();
    queue.add(root);
    while (!queue.isEmpty()) {
        Node first = queue.poll();
        result.add(first);
        List<Node> children = first.getChildren();
        if (children != null && children.size() > 0) {
            for (int i = 0; i < children.size(); i++) {
                queue.add(children.get(i));
            }
        }
    }
    View Code

    2.深度优先遍历——stack

    深度优先遍历指的是,从树的根节点开始,先遍历子树,然后遍历子树。

    我们借助结构来实现深度优先遍历。上图的深度优先遍历结果为:ABDECFG

    Stack<Node> stack = new Stack<Node>();
    List<Node> result = new ArrayList<Node>();
    stack.push(root);
    while (!stack.isEmpty()) {
        Node top = stack.pop();
        result.add(top);
        List<Node> children = top.getChildren();
        if (children != null && children.size() > 0) {
            for (int i = children.size() - 1; i >= 0; i--) {
                stack.push(children.get(i));
            }
        }
    }
    View Code

    常见的深度遍历次序:先序遍历、中序遍历、后序遍历

    有没有发现其实就是‘根’的位置发生了改变,前就是‘根’在前,中在中,后在后。 

    https://blog.csdn.net/dingqianyi2007/article/details/79585153

    一、先序遍历

    二、中序遍历

    三、后序遍历

    树的遍历有何实际用途

    1.输出文件名称的过程如下:

    如果是文件夹,先输出文件夹名,然后再依次输出该文件夹下的所有文件(包括子文件夹),如果有子文件夹,则再进入该子文件夹,输出该子文件夹下的所有文件名。这是一个典型的先序遍历过程。

    2.统计文件夹的大小过程如下:

    若要知道某文件夹的大小,必须先知道该文件夹下所有文件的大小,如果有子文件夹,若要知道该子文件夹大小,必须先知道子文件夹所有文件的大小。这是一个典型的后序遍历过程。

    3.中缀表达式转为后缀表达式(逆波兰表达式)。

    中缀表达式是一个通用的算术或逻辑公式表示方法。符合人类的逻辑(例:3 + 4) 
    后缀表达式是一种不需要括号的表达法。符合计算机的逻辑(例:3 4 +) 

    资料

    https://www.cnblogs.com/mfrank/p/9227097.html

    http://www.ruanyifeng.com/blog/2014/07/database_implementation.html

    https://www.cnblogs.com/wmyskxz/p/9295862.html

    https://www.cnblogs.com/CareySon/archive/2012/04/06/Imple-BTree-With-CSharp.html

    https://www.cnblogs.com/hohoa/p/12145689.html

  • 相关阅读:
    jdbc和DBeaver客户端连接oracle很慢,初始化连接成功后速度正常
    centos7中vncserver连接失败
    postgres数据库建库、修改owner
    nested exception is org.apache.ibatis.binding.BindingException:
    postgresql导出表insert方式数据
    解决ecllipse注释模板不生效问题
    postgresql 修改表属性,包括新增、修改、删除列
    ssh本机可登陆远端服务器,但远端服务器无法登陆本机
    linux源码安装后,设置动态库路径和环境变量
    valgrind跟踪调试动态库*.so
  • 原文地址:https://www.cnblogs.com/cnki/p/8944831.html
Copyright © 2011-2022 走看看