第6章树和二叉树old.ppt
《第6章树和二叉树old.ppt》由会员分享,可在线阅读,更多相关《第6章树和二叉树old.ppt(66页珍藏版)》请在三一办公上搜索。
1、第6章 树和二叉树,主要内容,6.1 树的定义和基本术语6.2 二叉树6.3 遍历二叉树6.4 线索二叉树6.5 树和森林6.6 赫夫曼树及其应用,6.1 树的定义和基本术语(1),树(Tree)是n(n 0)个结点的有限集。在任意一棵非空树中:A、有且仅有一个称为根的结点;B、当n 2时,其余结点分为m(m 0)个互不相交的子集,每个子集本身又是一棵树,称为根的子树。,以上是一个递归的定义在树的定义中又用到了树的概念,由此可见递归是树的固有特性。,6.1 树的定义和基本术语(2),每个子集都是满足树的定义的树,称为A的子树B子树、C子树、D子树。,树根A没有直接前驱;其余结点有且仅有一个直接
2、前驱,有0个或多个直接后继。,三个互不相交的子集:B,E,F,K,L C,G D,H,I,J,M,树的特征:层次性和分支性,6.1 树的定义和基本术语(3),结点的度:结点的非空子树个数树的度:树内各结点度的最大值分支结点(非终端结点):度非0的结点叶子结点(终端结点):度为0的结点孩子:结点的子树的根双亲:孩子的直接前驱结点兄弟:同一个双亲的孩子结点互称为兄弟子孙:以某结点为根的子树中的任一结点祖先:从根到该结点所经历的分支上的所有结点堂兄:双亲在同一层的结点,结点的层次:从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第L层,则其子树的根在第L+1层。树的深度(高度):结点层次的最
3、大值有序树和无序树:若树中所有结点的的各子树看成是从从至右是有次序的(即不能置换),称为有序树,否则称为无序树。森林:m(m0)个树的集合,Tree=(A(B(E(K,L),F),C(G),D(G,H(M),I,J),6.1 树的定义和基本术语(4),树的基本操作:构造空树InitTree(,6.1 树的定义和基本术语(5),6.2 二叉树,二叉树的定义二叉树的性质二叉树的存储结构,6.2.1 二叉树的定义(1),二叉树是另一种树型结构,它的特点是每个结点至多只有两 棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。二叉树可以为空,称为空二叉树;非空二
4、叉树一定有两个子树;左、右子树有次序关系,不能互换;二叉树可以有5种基本形态:二叉树不是结点的度都不超过2的有序树.,6.2 二叉树,左子树,右子树,6.2.1 二叉树的定义(2),具有三个结点的树与二叉树,6.2 二叉树,A、三个结点的树有两种不同的形态,B、三个结点的二叉树有五种不同的形态,树型结构的共同特征:层次性、分支性,6.2.1 二叉树的定义(3),二叉树的基本操作初始化空二叉树InitBiTree(&T)销毁二叉树DestroyBiTree(&T)创建二叉树CreateBiTree(&T,definition)清空二叉树ClearBiTree(&T)判断空二叉树BiTreeEmp
5、ty(T)求二叉树深度BiTreeDepth(T)求双亲parent(T,e)求左孩子LeftChild(T,e)求右孩子RightChild(T,e)求左兄弟LeftSibling(T,e)求右兄弟RightSibling(T,e)插入子树InsertChild(T,p,LR,c)删除子树DeleteChild(T,p,LR)先序遍历二叉树PreOrderTraverse(T,visite()中序遍历二叉树InOrderTraverse(T,visite()后序遍历二叉树PostOrderTraverse(T,visite()按层次遍历levelTraverse(T,visite(),6.2
6、 二叉树,6.2 二叉树,二叉树的定义二叉树的性质二叉树的存储结构,6.2.2 二叉树的性质(1),性质1 在二叉树的第i层上至多有2i-1个结点(i 1);性质2 深度为k的二叉树上至多有2k-1个结点(k 1);性质3 设任意一棵二叉树中有n0个度为0的结点,n2个度为2个结点,则有:n0=n2+1;,6.2 二叉树,满二叉树:一棵深度为k且有 2k1个结点的二叉树。即:所有非终端结点的度都等于2,且所有树叶都分布在同一个层次上。,完全二叉树:将深度为k,有n个结点的二叉树自上而下,自左向右进行编号,当且仅当编号与深度为k的满二叉树中前n个结点一一对应。,6.2.2 二叉树的性质(2),性
7、质4 完全二叉树的深度为k log2n+1 或 k=log2(n+1);性质5 将完全二叉树自上而下,自左向右地编号,对任意一结点i(1 i n)的结点X有:A、若i1,则X是根;若i1,则X的PARENT(i)=i/2;B、若X有左孩子,则X左孩子LCHILD(i)=2i;C、若X有右孩子,则X右孩子RCHILD(i)=2i1;D、若i为奇数且i1,则X的左兄弟为i1;E、若i为偶数且in,则X的右兄弟为i1;,6.2 二叉树,i 为偶数,i 为奇数,6.2 二叉树,二叉树的定义二叉树的性质二叉树的存储结构,6.2.3 二叉树的存储结构(1),设计存储结构的一般原则:保存所有的数据元素 正确
8、地表达出数据元素之间的逻辑关系 便于对数据进行操作和运算 节省空间 二叉树的存储结构:顺序存储结构 链式存储结构,6.2 二叉树,6.2.3 二叉树的存储结构(2),顺序存储结构 根据二叉树性质5,则可以利用一数组存放一棵完全二叉树.,6.2 二叉树,A,C,B,E,D,F,.,结点在完全二叉树中的编号与数组下标一致,可利用性质5来计算结点的双亲、孩子、兄弟的下标。,6.2.3 二叉树的存储结构(3),对于普通二叉树,可以将其补足成完全二叉树后再进行编号,存储。,6.2 二叉树,?,基本数据结构:#define MAX_TREE_SIZE 100typedef TElemType SqBiTr
9、eeMAX_TREE_SIZE;SqBiTree bt;,6.2.3 二叉树的存储结构(4),链式存储结构,6.2 二叉树,左孩子指针,二叉链表,右孩子指针,结点值,三叉链表,亲代指针,6.2.2 二叉树的存储结构(5),6.2 二叉树,二叉树,三叉链表表示,二叉链表表示,基本数据结构:typedef struct BiTNode TElemType data;struct BiTNode*lchild,*rchild;BiTNode,*BiTree;,6.3 遍历二叉树,遍历二叉树遍历二叉树的递归与非递归算法表达式求值二叉树的运算举例层序遍历二叉树,6.3.1 遍历二叉树(1),遍历:按某种
10、次序访问二叉树的所有结点,且每个结点仅访问一次。“访问”的含义非常的广泛,可以是对结点作各种处理,如输出结点的信息等。根据二叉树的结构:左子树_根_右子树,可以把对二叉树的遍历分解为三项子任务:访问根 D遍历左子树 L遍历右子树 R根据这三项任务的执行次序的不同,有六种可能的遍历方案:DLR、LDR、LRD先左后右DRL、RDL、RLD先右后左如果约定先左后右,则取前三种方案,6.3 遍历二叉树,6.3.1 遍历二叉树(2),根据访问根的时机不同,将这三种遍历方案分别称为:先根遍历(先序遍历)DLR中根遍历(中序遍历)LDR后根遍历(后序遍历)LRD,6.3 遍历二叉树,6.3 遍历二叉树,遍
11、历二叉树遍历二叉树的递归与非递归算法表达式求值二叉树的运算举例层序遍历二叉树,6.3.2 遍历二叉树的递归与非递归算法(1),先序遍历二叉树 若二叉树为空,则空操作;否则访问根;先序遍历左子树;先序遍历右子树;,6.3 遍历二叉树,void PreOrderTraverse(BiTree T)if(!T)return;visit(T-data);/访根 PreOrderTraverse(T-lchild);PreOrderTraverse(T-rchild);,6.3.2 遍历二叉树的递归与非递归算法(2),先序遍历二叉树,6.3 遍历二叉树,A,C,B,E,D,L,F,K,G,J,I,H,6
12、.3.2 遍历二叉树的递归与非递归算法(3),中序遍历二叉树 若二叉树为空,则空操作;否则中序遍历左子树;访问根;中序遍历右子树;,6.3 遍历二叉树,void InOrderTraverse(BiTree T)if(!T)return;InOrderTraverse(T-lchild);visit(T-data);/访根 InOrderTraverse(T-rchild);,6.3.2 遍历二叉树的递归与非递归算法(4),中序遍历二叉树,6.3 遍历二叉树,A,C,B,E,D,L,F,K,G,J,I,H,6.3.2 遍历二叉树的递归与非递归算法(5),后序遍历二叉树 若二叉树为空,则空操作;
13、否则后序遍历左子树;后序遍历右子树;访问根;,6.3 遍历二叉树,void PostOrderTraverse(BiTree T)if(!T)return;PostOrderTraverse(T-lchild);PostOrderTraverse(T-rchild);visit(T-data);/访根,6.3.2 遍历二叉树的递归与非递归算法(6),先序遍历二叉树,6.3 遍历二叉树,A,C,B,E,D,L,F,K,G,J,I,H,6.3.2 遍历二叉树递归与非递归算法(7),中序遍历的非递归算法(借助堆栈实现)void InOrderTraverse(BiTree bt,void(*visi
14、t)(BiTree)/中序遍历的非递归算法 InitStack(S);Push(S,T);While(!StackEmpty(S)While(GetTop(S,p),6.3 遍历二叉树,6.3.2 遍历二叉树递归与非递归算法(8),先序遍历的非递归算法(借助堆栈实现)void PreOrderTraverse(BiTree bt)if(!bt)return;InitStack(S);push(S,bt);/树根的指针进栈while(!EmptyStack(S)pop(S,p);while(p)/沿着左链一路向下 visit(p-data);/访问 if(p-rchild)push(S,p-rc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 old
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5650912.html