第五章 树和二叉树(理论)

树结构是非线性数据结构,树是以分支关系定义的层次结构。

        操作系统中,用树来表示文件目录的组织结构

        编译系统中,用树来表示源程序的语法结构

5.1树和二叉树的定义

树的其他三种表示方法:嵌套集合、广义表、凹入表示法。

叶子结点=终端结点

非叶子结点=非终端结点=分支结点=根结点+内部结点

有序树和无序树:树中结点的各子树从左到右有次序(不能互换),则称该树为有序树。

二叉树:每个结点至多有两棵子树;子树有左右之分,次序不能任意颠倒。

树和二叉树的关系:

        二叉树和树是并列的,无包含关系;

        普通树(多叉树)若不转成二叉树,运算很难实现,二叉树结构最简单、规律最强;

        所有树都能转化成唯一对应的二叉树。

具有3个结点的二叉树有5种形态;

                       普通树    2

5.2二叉树的性质和存储结构

性质1:在二叉树的第 i 层至多 2^(i-1) 个结点

性质2:深度为k的二叉树至多2^k  -1 个结点

性质3: 叶结点数为n0,度为2的结点数为n2,有n0 =n2 + 1

         证明:结点总数 n0+n1+n2=n1+2n2+1 分支数+1根结点

满二叉树:深度为k且结点数为2^k -1的二叉树

完全二叉树:

性质4:具有n 个结点的二叉树的深度为 log n 取下界 +1

性质5:对一棵完全二叉树按层序编号,有:

       编号从1开始: 编号为i的结点,左孩子为2i,右孩子为2i+1,双亲编号为i/2取下界;

       编号从0开始: 编号为i的结点,左孩子为2i+1,右孩子为2i+2,双亲编号为i-1/2取下界;

二叉树的存储结构:顺序存储结构、链式存储结构(二叉链表和三叉链表)

二叉链表:数据域、左右指针域;

三叉链表:增加指向双亲的指针域

含有n个结点的二叉链表有n+1个空链域,利用空链域可得线索链表

5.3遍历二叉树

线索二叉树是第一次遍历时将结点的前驱、后继信息存储下来,便于再次遍历。

遍历二叉树是指按照某条搜索路径巡访树中每个结点,使得每个结点有且仅有访问一次。

遍历的实质是对二叉树进行线性化,将非线性结构的树中结点排成线性序列。

先序遍历DLR,中序遍历LDR,后序遍历LRD。都属于深度遍历。

   层序遍历,广度遍历,借助队列。

波兰式、逆波兰式

遍历时,每个结点经过3次:

        第一次经过时访问,先序遍历;

        第二次经过时访问,中序遍历;

        第三次经过时访问,后序遍历。

虚线表示遍历算法的递归执行过程,在此过程中,第一次经过输出为先序,第二次经过为中序,第三次经过为后序。

中序遍历(递归算法)

void inorder(node* root){
    if(root==NULL)
        return;
    inorder(root->lchild);
    printf("%d",root->data);
    inorder(root->rchild);
}

栈:递归->非递归  用栈可以将递归算法改写成非递归算法

所需辅助空间为遍历过程中栈的最大容量,即树的深度,O(n)。

先中、后中、层中均能唯一的确定一颗二叉树

5.4线索二叉树

有n个结点的二叉链表必定存在n+1个空链域,利用这些空链域来存放前驱和后继信息。

规定:该结点有左子树,lchild指向左孩子,否则指向其前驱;

           该结点有右子树,rchild指向右孩子,否则指向其后继。增加标志域

5.4树和森林

树的存储结构:双亲表示法、孩子表示法、孩子兄弟法

双亲表示法:易求双亲和根结点,求孩子需遍历整个结构

孩子表示法:

孩子兄弟表示法(二叉树表示法、二叉链表表示法):易于找孩子,它和二叉树的二叉链表表示完全一样,便于将一般的树结构转化为二叉树。任意一棵树都能通过孩子兄弟表示法转化为二叉树进行存储。

森林和二叉树的转化

加线-抹线-旋转

兄弟相随,长兄为父

任一棵和树对应的二叉树,根结点右子树必空

遍历树和森林一样的

5.5哈夫曼树(Huffman)

哈夫曼树:最优树,一类带权路径长度WPL最短的树

哈夫曼算法:总是合并最小的,保证权大的离根结点较近。贪心算法。

哈夫曼树不唯一,左右无序

不定长编码:为出现次数较多的字符编以较短的编码

前缀编码:任一编码都不是其他任何编码的前缀

                  保证对压缩文件进行解码时不产生二义性,确保正确解码 

哈夫曼编码是前缀编码,是最优前缀编码。约定左分支标记为0,右分支标记为1

 路径长度:路径上的分支数

5.6判定树

折半查找也称二分查找,适用于顺序存储有序表

折半查找的判定树:结点值为在表中的位置序号。

假设每个记录的查找概率相同,根据此判定树,对长度为11的有序表进行折半查找的ASL平均查找长度为:ASL=(1+2*2+3*4+4*4)/11=3  时间复杂度O(log n)

 判定树的形态只与表记录个数有关,具有n个结点的判定树深度为 log n取下界+1 

折半查找在查找成功和不成功时给定值和关键字比较的次数最多为判定树的深度

给定4.9,向下取整函数得到4,向上取整函数得到5。

内部结点。外部结点(查找失败)。

5.7树表的查找

5.7.1二叉排序树BST

二叉排序树(Binary Sort Tree)又称二叉查找树。排序、查找

左子树所有结点的值均小于根结点的值,右子树所有结点的值均大于根结点的值

二叉排序树的中序遍历递增序列

给定值和关键字比较的次数等于:路径长度+1,分支数+1,结点所在的层次树

长度为n的顺序表的折半查找判定树唯一,n个结点的二叉排序树与序列有关。

二叉排序树的查找长度与log n是同数量级的。最差情况:当序列有序时,二叉排序树退化为单支树,深度为n,平均查找长度(n+1)/2。最好情况,和折半查找判定树类似,平均长度与log n成正比。

5.7.2平衡二叉树AVL

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本资源是以压缩包的形式上传的, 里面是本书的“第3卷(第2版 中文版)排序与查找, 本压缩包里”是一本pdf格式电子书。 本书一共4卷, 其中3本中文版,一本英文版, 会陆续的上传上来。 需要下载的朋友,可以在我的“资源里”找。 本卷还有习题答案。 本书作者:Donald E. Knuth(著); 内容简介: 《计算机程序设计艺术》系列被公认为计算机科学领域的经*之作,深入阐述了程序设计理论,对计算机领域的发展有着极为深远的影响。本书为该系列的第3卷,全面讲述了排序和查找算法。书中扩展了卷1中数据结构的处理方法,并对各种算法的效率进行了大量的分析。 章节目录: 第5 章排序. . . . . . . . . 1 *5.1 排序的组合性质. . . 8 *5.1.1 反序. . . . . . . 8 *5.1.2 多重集的排列. . . 16 *5.1.3 游程. . . . . .. . 36 5.2 内部排序. . . . . . . 56 5.2.1 插入排序. . . . . . 61 5.2.2 交换排序. . . . . . 81 5.2.3 选择排序. . . . . . 107 5.2.4 合并排序. . . . . . 123 5.2.5 分布排序. . . . . . 131 5.3 *优排序. . . . . . . 140 5.3.1 比较次数*少的排序. 140 *5.3.2 比较次数*少的合并. 153 *5.3.3 比较次数*少的选择. 161 *5.3.4 排序网络. . . .. . 171 5.4 外部排序. . . . . . . 194 5.4.1 多路合并和替代选择. 197 *5.4.2 多阶段合并. . . . 208 *5.4.3 级联合并. . . . . 226 *5.4.4 反向读取磁带. . . 235 *5.4.5 振荡排序. . . . . 245 *5.4.6 磁带合并的实践考虑. 250 *5.4.7 外部基数排序. . . . 269 *5.4.8 双磁带排序. . . . 273 *5.4.9 磁盘与磁鼓. . . . 279 5.5 小结、历史与文献. . . 297 第6 章查找. . . . . . . . 306 6.1 顺序查找. . . . . . . 308 6.2 通过键的比较进行查找. .318 6.2.1 查找有序表. . . . . 318 6.2.2 二叉树查找. . . . . 332 6.2.3 平衡树. . . . . . . 358 6.2.4 多路树. . . . . . . 376 6.3 数字查找. . . . . . . 385 6.4 散列. . . . . . . . . .402 6.5 辅助键的查找. . . . . .437
1. 什么是二叉树? 二叉树是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。 2. 什么是二叉搜索树? 二叉搜索树是一种特殊的二叉树,其中左子节点的值小于等于父节点的值,右子节点的值大于等于父节点的值。 3. 什么是完全二叉树? 完全二叉树是一种特殊的二叉树,除了最后一层外,每一层都必须填满,且最后一层从左到右依次填入节点。 4. 什么是平衡二叉树? 平衡二叉树是一种特殊的二叉搜索树,其左右子树高度差不超过1。 5. 什么是二叉树的遍历? 二叉树的遍历是指按照某种顺序依次访问二叉树中的每个节点,常见的遍历方式包括前序遍历、中序遍历和后序遍历。 6. 什么是二叉树的前序遍历? 二叉树的前序遍历是指按照根节点、左子树、右子树的顺序依次访问二叉树中的每个节点。 7. 什么是二叉树的中序遍历? 二叉树的中序遍历是指按照左子树、根节点、右子树的顺序依次访问二叉树中的每个节点。 8. 什么是二叉树的后序遍历? 二叉树的后序遍历是指按照左子树、右子树、根节点的顺序依次访问二叉树中的每个节点。 9. 什么是二叉树的层序遍历? 二叉树的层序遍历是指按照从上到下、从左到右的顺序依次访问二叉树中的每个节点。 10. 如何判断一个二叉树是否为二叉搜索树? 可以通过中序遍历得到二叉树中所有节点的值,然后判断这些值是否按照升序排列即可判断是否为二叉搜索树。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值