数据结构 C语言版 第2版 李云清 杨庆红 揭安全 第6章_树型结构新.pptVIP

  • 7
  • 0
  • 约 58页
  • 2015-12-24 发布于广东
  • 举报

数据结构 C语言版 第2版 李云清 杨庆红 揭安全 第6章_树型结构新.ppt

所谓树的遍历,指按某种规定的顺序访问树中的每一个结点一次,且每个结点仅被访问一次。树的遍历方式分为以下三种: 6.4 树的遍历 (1)树的前序遍历:首先访问根结点,再依次按前序遍历的方式访问根结点的每一棵子树。 (2)树的后序遍历:首先按后序遍历的方式访问根结点的每一棵子树,然后再访问根结点。 (3)树的层次遍历:首先访问第一层上的根结点,然后从左到右依次访问第二层上的所有结点,再以同样的方式访问第三层上的所有结点,……,最后访问树中最低一层的所有结点。 B C D E F G A H I 前序遍历的结果: ABCEFHIGD 后序遍历的结果: BEHIFGCDA 层次遍历的结果: ABCDEFGHI 以下以指针方式的孩子表示法作为树的存储结构,分别实现树的各种遍历算法。 1、树的前序遍历的递归实现 void preorder(tree p) /*p为指向树根结点的指针*/ { int i; if (p!=NULL) /*树不为空*/ { printf(“%c”,p-data); for (i=0;im;++i) preorder(p-child[i]); //递归对各子树进行遍历 } } 2、树的后序遍历的递归实现 void postorder(tree p) /*p为指向树根结点的指针*/ { int i; if (p!=NULL) /*树不为空*/ { for (i=0;im;++i) postorder(p-child[i]); printf(%c,p-data); } } 3、按前序遍历顺序建立一棵3度树的递归算法 void createtree (tree *p ) { int i; char ch; if ((ch=getchar())= =‘ ’) *p=NULL; else { *p=(tree) malloc (sizeof(node)); /*产生树的根结点*/ (*p)-data=ch; for (i=0;im;++i) /*按前序遍历顺序依次产生每棵子树*/ createtree((*p)-child[i]); } } 4、树的层次遍历算法 在树的层次遍历过程中,对于某一层上的每个结点被访问后,应立即将其所有子女结点按从左到右的顺序依次保存起来,该层上所有结点的这些子女结点正好构成下一层的所有结点,接下来应该被访问的就是它们。显然,这里用于保存子女结点的数据结构选择队列最合适,队列中的每个元素均为在排队等待访问的结点。 4、树的层次遍历算法 由于树的层次遍历首先访问的是根结点,因此初始时队列中仅包含根结点。只要队列不为空,就意味着还有结点未被访问,遍历就必须继续进行;每次需访问一个结点时均取队头元素,访问完成后,若其子女非空,则将其所有子女按顺序依次进队;不断重复以上过程,直到队列为空。 void levelorder(tree t) {tree queue[20]; /*存放等待访问的结点队列*/ int f,r,i; /*f、r分别为队头、队尾指针*/ tree p; f=0; r=0; queue[0]=t; while (f=r) /*队列不为空*/ { p=queue[f]; f++; printf(%c,p-data); for (i=0;im;++i) if (p-child[i]) { ++r; queue[r]=p-child[i]; } } } 6.5 树的线性表示 6.5.1 树的括号表示 1、树的括号表示的规则为: (1)若树T为空树,则其括号表示为空; (2)若树T只包含一个结点,则其括号表示即为该 结点本身; (3)如果树T由根结点A和它的m棵子树T1,T2,…Tm 构成,则其括号表示为: A(T1的括号表示,T2的括号表示,……Tm的括号表示) 其中子树的括号表示同样应该遵循以上规则。 * 退出 李云清 杨庆红 揭安全 高等学校精品课程 人民邮电出版社 (第2版) 揭安全 江西省高等学校精品课程 E_mail: jieanquan@163.com 江西师范大学计算机信息工程学院 第6章 树型结构 树的基本概念 树的遍历 树

文档评论(0)

1亿VIP精品文档

相关文档