数据结构课件 树和二叉树.pptVIP

  • 10
  • 0
  • 约1.75万字
  • 约 121页
  • 2017-11-30 发布于江西
  • 举报
数据结构课件 树和二叉树

第六章 树和二叉树 6.1 树的定义和基本概念 6.2 二叉树 6.2.1 树的定义和基本术语 6.2.2 二叉树的性质 6.2.3 二叉树的存储结构 6.3 遍历二叉树 6.3.1 遍历二叉树 6.3.2 线索二叉树 6.4 树和森林 6.4.1 树的存储结构 6.4.2 森林与二叉树的转换 树的基本概念: 结点(node)——表示树中的元素,包括数据项及若干指向其子树的分支 结点的度(degree)——结点拥有的子树数 叶子(leaf)——度为0的结点称为叶子或终端结点。 非终端结点——度不为0的结点称为非终端结点或分支结点。 深度(depth)——树中结点的最大层次数 森林(forest)——m(m?0)棵互不相交的树的集合 有序树 ——若一棵树中所有子树从左到右的排序是有顺序的,不能颠倒次序。称该树为有序树。 无序树——若一棵树中所有子树的次序无关紧要,则称为无序树。 6.2 二叉树 二叉树在树结构的应用中起着非常重要的作用,因为对二叉树的许多操作算法简单,而任何树都可以与二叉树 相互转换,这样就解决了树的存储结构及其运算中存在的复杂性。 6.2.1 二叉树的定义 定义:二叉树是由n(n=0)个结点的有限集合构成,此集合或者为空集,或者由一个根结点及两棵互不相交的左右子树组成,并且左右子树都是二叉树。 这也是一个递归定义。二叉树可以是空集合,根可以有空的左子树或空的右子树。 二、递归法遍历二叉树 下面对于访问节点用printf替代,用二叉链表做为存储结构,三种遍历二叉树的递归算法描述 先序遍历算法可描述为: ????? void PreOrder(BinTree T) ?????? { //算法里①~⑥是为了说明执行过程加入的标号 ???????? ① if(T) { // 如果二叉树非空 ???????? ②??? printf(“%c”,T-data); // 访问根结点 ????????③??? PreOrder(T-lchild);//访问左子树 ???????? ?④? ??PreOrder(T-rchild); //访问右子树 ????????⑤? } ??? ⑥ } // PreOrder 中序遍历算法可描述为: ????? void InOrder(BinTree T) ??????? { //算法里①~⑥是为了说明执行过程加入的标号 ① if(T) { // 如果二叉树非空 ????????? ②??? InOrder(T-lchild); //访问左子树 ????????? ③??? printf(“%c”,T-data); // 访问根结点 ????????? ④??? InOrder(T-rchild); //访问右子树 ???????? ⑤? } ??? ⑥ } // InOrder 后序遍历算法可描述为: ????? void PosOrder(BinTree T) ??????? { //算法里①~⑥是为了说明执行过程加入的标号 ???????? ① if(T) { // 如果二叉树非空 ????????? ②??? PosOrder(T-lchild); //访问左子树 ?? ③????PosOrder(T-rchild); //访问右子树 ④ ??? printf(“%c”,T-data); //访问根结点 ?????? ⑤? } ? ⑥ } // PosOrder 三种遍历二叉树的非递归算法描述 中序遍历: Status Inorder(BiTree T){ BiTNode *p; p=T; InitStack(S); printf(“\ninorder traversal :\n); while(!(p==NULLStackEmpty(S))){ while (p!=NULL){//向左走到尽头 push(S,p); p=p-lchild; } Pop(S,p); //弹出栈顶元素处理 printf(“%c ”,p-data); p=p-rchild; //处理右子树

文档评论(0)

1亿VIP精品文档

相关文档