树结构是非线性数据结构,树是以分支关系定义的层次结构。
操作系统中,用树来表示文件目录的组织结构;
编译系统中,用树来表示源程序的语法结构。
树的其他三种表示方法:嵌套集合、广义表、凹入表示法。
叶子结点=终端结点
非叶子结点=非终端结点=分支结点=根结点+内部结点
有序树和无序树:树中结点的各子树从左到右有次序(不能互换),则称该树为有序树。
二叉树:每个结点至多有两棵子树;子树有左右之分,次序不能任意颠倒。
树和二叉树的关系:
二叉树和树是并列的,无包含关系;
普通树(多叉树)若不转成二叉树,运算很难实现,二叉树结构最简单、规律最强;
所有树都能转化成唯一对应的二叉树。
具有3个结点的二叉树有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个空链域,利用空链域可得线索链表
线索二叉树是第一次遍历时将结点的前驱、后继信息存储下来,便于再次遍历。
遍历二叉树是指按照某条搜索路径巡访树中每个结点,使得每个结点有且仅有访问一次。
遍历的实质是对二叉树进行线性化,将非线性结构的树中结点排成线性序列。
有先序遍历DLR,中序遍历LDR,后序遍历LRD。都属于深度遍历。
层序遍历,广度遍历,借助队列。
波兰式、逆波兰式
遍历时,每个结点经过3次:
第一次经过时访问,先序遍历;
第二次经过时访问,中序遍历;
第三次经过时访问,后序遍历。
虚线表示遍历算法的递归执行过程,在此过程中,第一次经过输出为先序,第二次经过为中序,第三次经过为后序。
中序遍历(递归算法)
void inorder(node* root){
if(root==NULL)
return;
inorder(root->lchild);
printf("%d",root->data);
inorder(root->rchild);
}
栈:递归->非递归 用栈可以将递归算法改写成非递归算法
所需辅助空间为遍历过程中栈的最大容量,即树的深度,O(n)。
先中、后中、层中均能唯一的确定一颗二叉树
有n个结点的二叉链表必定存在n+1个空链域,利用这些空链域来存放前驱和后继信息。
规定:该结点有左子树,lchild指向左孩子,否则指向其前驱;
该结点有右子树,rchild指向右孩子,否则指向其后继。增加标志域
树的存储结构:双亲表示法、孩子表示法、孩子兄弟法
双亲表示法:易求双亲和根结点,求孩子需遍历整个结构
孩子表示法:
孩子兄弟表示法(二叉树表示法、二叉链表表示法):易于找孩子,它和二叉树的二叉链表表示完全一样,便于将一般的树结构转化为二叉树。任意一棵树都能通过孩子兄弟表示法转化为二叉树进行存储。
森林和二叉树的转化
加线-抹线-旋转
兄弟相随,长兄为父
任一棵和树对应的二叉树,根结点右子树必空
遍历树和森林一样的
哈夫曼树:最优树,一类带权路径长度WPL最短的树
哈夫曼算法:总是合并最小的,保证权大的离根结点较近。贪心算法。
哈夫曼树不唯一,左右无序
不定长编码:为出现次数较多的字符编以较短的编码
前缀编码:任一编码都不是其他任何编码的前缀
保证对压缩文件进行解码时不产生二义性,确保正确解码
哈夫曼编码是前缀编码,是最优前缀编码。约定左分支标记为0,右分支标记为1
路径长度:路径上的分支数
折半查找也称二分查找,适用于顺序存储的有序表
折半查找的判定树:结点值为在表中的位置序号。
假设每个记录的查找概率相同,根据此判定树,对长度为11的有序表进行折半查找的ASL平均查找长度为:ASL=(1+2*2+3*4+4*4)/11=3 时间复杂度O(log n)
判定树的形态只与表记录个数有关,具有n个结点的判定树深度为 log n取下界+1
折半查找在查找成功和不成功时给定值和关键字比较的次数最多为判定树的深度
给定4.9,向下取整函数得到4,向上取整函数得到5。
内部结点。外部结点(查找失败)。
二叉排序树(Binary Sort Tree)又称二叉查找树。排序、查找
左子树所有结点的值均小于根结点的值,右子树所有结点的值均大于根结点的值
二叉排序树的中序遍历为递增序列。
给定值和关键字比较的次数等于:路径长度+1,分支数+1,结点所在的层次树
长度为n的顺序表的折半查找判定树唯一,n个结点的二叉排序树与序列有关。
二叉排序树的查找长度与log n是同数量级的。最差情况:当序列有序时,二叉排序树退化为单支树,深度为n,平均查找长度(n+1)/2。最好情况,和折半查找判定树类似,平均长度与log n成正比。