【数据结构】第五章 树与二叉树
1.树的基本概念
1.1 树的定义
���是n(n≥0)个结点的有限集。当n=0时,称为空树。在任意一棵非空树中应满足:
- 有且仅有一个特定的称为根的结点。
- 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T,T,…,Tm,其中每个集合本身又是一棵树,并且称为根的子树。
树是一种递归的数据结构。在n个结点的树中有n-1条边。
1.2 基本术语
1.3 树的性质
1.4 习题
2.二叉树的概念
2.1 二叉树的定义及其主要特性
2.1.1 二叉树的定义
与树相似,二叉树也以递归的形式定义。二叉树是n(n≥0)个结点的有限集
- 或者为空二叉树,即n=0。
- 或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。
二叉树是有序树,有5种形态:
2.1.2 几种特殊的二叉树
2.1.3 二叉树性质
2.2 二叉树存储结构
2.2.1 顺序存储结构
二叉树的顺序存储是指用一组连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树上编号为i的结点元素存储在一维数组下标为i-1的分量中。依据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映结点之间的逻辑关系,这样既能最大可能地节省存储空间,又能利用数组元素的下标值确定结点在二叉树中的位置,以及结点之间的关系。
2.2.2 链式存储结构
2.3 习题
3.二叉树的遍历和线索二叉树
3.1 二叉树的遍历
3.1.1 先序遍历(NLR)
void Preorder (BiTree T){ if(T!=NULL){ visit(T);//访问根结点 Preorder(T->lchild);//递归遍历左子树 Preorder(T->rchild);//递归遍历右子树 } }
3.1.2 中序遍历(LNR)
void InOrder (BiTree T){ if(T!=NULL){ Inorder (T->lchild);//递归遍历左子树 visit(T);//访问根结点 InOrder (T->rchild);//递归遍历右子树 } }
3.1.3 后序遍历(LRN)
void Postorder(BiTree T){ if(T!=NULL){ Postorder (T->lchild);//递归遍历左子树 Postorder(T->rchild) ;//递归遍历右子树 visit(T);//访问根结点 } }
3.1.4 递归算法和非递归算法的转换
3.1.5 层次遍历
void Level0rder (BiTree T){ InitQueue(Q);//初始化辅助队列 BiTree p; EnQueue(Q,T);//将根结点入队 while(!IsEmpty (Q)){//队列不空则循环 DeQueue(Q,p);//队头结点出队 visit(p);//访问出队结点 if(p->lchild!=NULL) EnQueue(o,p->lchild);//若左孩子不空,则左孩子入队 if(p->rchild!=NULL) EnQueue(Q,p->rchild);//若右孩子不空,则右孩子入队 } }
3.1.6 由遍历序列构造二叉树
若已知中序序列,再给出其他三种遍历序列中的任意一种,就可以唯一地确定一棵二叉树。
3.2 线索二叉树
3.2.1 线索二叉树的基本概念
规定:若无左子树,令lchild指向其前驱结点;若无右子树,令rchild指向其后继结点。
3.2.2 中序线索二叉树的构造
3.2.3 中序线索二叉树的遍历
3.2.4 先序和后序线索二叉树的遍历
3.3 习题
4.树、森林
4.1 树的存储结构
4.1.1 双亲表示法(顺序存储)
4.1.2 孩子表示法(顺序+链式存储)
4.1.3 孩子兄弟表示法(链式存储)
4.2 树、森林与二叉树的转换
4.2.1 树转换二叉树
4.2.1 森林转换二叉树
4.2.3 二叉树转换森林
4.3 树和森林的遍历
4.3.1 树的遍历
4.3.2 森林的遍历
4.4 习题
5.树与二叉树的应用
5.1 哈夫曼树和哈夫曼编码
5.1.1 哈夫曼树的定义
5.1.2 哈夫曼树的构造
5.1.2 哈夫曼树的编码
5.2 并查集
5.3 习题
The End