树 树定义 专业定义: 1、有且只有一个称为根的节点 2、有若干个互不相交的子树,这些子树本身也是一棵树 通俗定义: 1、树是由节点和边组成 2、每个节点只有一个父节点但可以有多个子节点 3、但有一个节点例外,该节点没有根节点,此节点称为根节点 专业术语 节点 父节点 子节点 子孙 堂兄弟 深度: 从根节点到最底层节点的层数称之为深度 根节点是第一层 叶子节点;(叶子就不能劈叉了) 没有子节点的节点 非终端节点: 实际就是非叶子节点。 根节点既可以是叶子也可以是非叶子节点 度: 子节点的个数称为度。(一棵树看最大的) 树分类: 一般树 任意一个节点的子节点的个数都不受限制 二叉树(有序树) 任意一个节点的子节点的个数最多两个,且子节点 的位置不可更改。 分类: 一般二叉树 满二叉树 在不增加树的层数的前提下。无法再多 添加一个节点的二叉树就是满二叉树。 完全二叉树 如果只是删除了满二叉树最底层最右边的 连续若干个节点,这样形成的二叉树就是 完全二叉树。 森林 n个互不相交的树的集合 一般的二叉树要以数组的方式存储,要先转化成完全二叉树,因为如果你 只存有效节点(无论先序,中序,后序),则无法知道这个树的组成方式 是什么样子的。 树的存储(都是转化成二叉树来存储) 二叉树的存储 连续存储【完全二叉树】 优点: 查找某个节点的父节点和子节点(也包括判断有咩有)速度很快 缺点: 耗用内存空间过大 链式存储 一般树的存储 双亲表示法 求父节点方便 孩子表示法 求子节点方便 双亲孩子表示法 求父节点和子节点都很方便 二叉树表示法 把一个普通树转化成二叉树来存储 具体转换方法: 设法保证任意一个节点的 左指针域指向它的第一个孩子 有指针域指向它的下一个兄弟 只要能满足此条件,就可以把一个普通树转化成二叉树 一个普通树转化成的二叉树一定没有右子树 森林的存储 先把森林转化为二叉树,再存储二叉树,具体方式为:根节点 之间可以当成是兄弟来看待 二叉树操作 遍历 先序遍历【先访问根节点】 先访问根节点 再先序访问左子树 再先序访问右子树 中序遍历【中间访问根节点】 中序遍历左子树 再访问根节点 再中序遍历右子树 后序遍历【最后访问根节点】 先后序遍历左子树 再后序遍历右子树 再访问根节点 已知两种遍历序列求原始二叉树 通过先序和中序 或者 中序和后续我们可以 还原出原始的二叉树 但是通过先序和后续是无法还原出原始的二叉树的 换种说法: 只有通过先序和中序, 或通过中序和后序 我们才可以唯一的确定一个二叉树 应用 树是数据库中数据组织的一种重要形式(例如图书馆 的图书分类一层一层往下分。) 操作系统子父进程的关系本身就是一棵树 面向对象语言中类的继承关系本身就是一棵树 赫夫曼树(树的一个特例) 图 模块三:查找和排序 折半查找 排序: 冒泡 插入 选择 快速排序 归并排序 排序和查找的关系 排序是查找的前提 排序是重点 Java中容器和数据结构相关知识 Iterator接口 Map 哈希表(与Java关系比较大) 再次讨论什么是数据结构: 数据结构研究是数据结构的存储和数据的操作的一门学问 数据的存储分为两部分: 个体的存储 个体关系的存储 从某个角度而言,数据的存储最核心的就是个体关系 的存储,个体的存储可以忽略不计。 再次讨论到底什么是泛型: 同一种逻辑结构,无论该逻辑结构物理存储是什么样子的 我们都可以对它执行相同的操作(例如都是线性结构或者 用数组实现的树和用链表实现的树。利用重载技术。)