第02章_树型结构.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第02章_树型结构

2.5 树的线性表示 树的线性表示便于树的输入、输出,同时在存储时也比较节省存储空间。本节主要介绍树的两种线性表示方法:括号表示法和层号表示法。 6.5.1 树的括号表示 1、树的括号表示的规则为: (1)若树T为空树,则其括号表示为空; (2)若树T只包含一个结点,则其括号表示即为该 结点本身; (3)如果树T由根结点A和它的m棵子树T1,T2,……Tm 构成,则其括号表示为: A(T1的括号表示,T2的括号表示,……Tm的括号表示) 其中子树的括号表示同样应该遵循以上规则。 A B C F G H D E J I A ( B, C ( F , G ,H ) , D , E ( J , I ) ) 2、树的括号表示具有以下特点: (1)“(”前面的元素一定为某棵树或子树的根结点,而其所有子树中的结点一定位于该“(”和与之对应的“)”之间; (2)任何“(”和与之配对的“)”之间的括号表示序列同样满足(1)中的性质。 图6 .10 3、树的括号表示到树的孩子表示的转换算法 (1)从左到右扫描树的括号表示; (2)每当遇到左括号时,其前一个结点进栈,并读 下一个符号; (3)每当遇到右括号时,栈顶元素出栈。说明以栈 顶元素为根的子树构造完毕,此时若栈为空, 算法结束,否则读下一个符号; (4)每当遇见结点,则它一定为栈顶元素的子女, 将其挂到栈顶元素的某子女位置上,并读下一 个符号; (5)每当遇到“,”,则滑过该符号,并读下一个符 号。 #define m 3 /* 树的度数*/ #define MAXSIZE 20 /* 树的孩子表示法对应的数组大小*/ #define BMAXSIZE 50 /*树的括号表示对应的数组大小*/ typedef char datatype; /* 树中结点值的类型*/ typedef struct node { /*树的孩子表示法中结点的类型*/ datatype data; int child[m]; } treenode; treenode tree[MAXSIZE]; /*树孩子表示法的存储数组*/ int root ; /*根结点的下标*/ int length; /*树中实际所含结点的个数*/ char p[BMAXSIZE]; /*存放树括号表示的数组*/ void bracktotree(char p[],int *root, int *length,treenode tree[]) { /*将树的括号表示法转换成树的孩子表示法*/ int stack[MAXSIZE]; int top; int i,j,k,l,done; k=0; j=0; *root=0; top=-1; done=1; tree[j].data=p[k]; ++k; for (i=0;im;++i) tree[j].child[i]=-1; while (done) { if (p[k]==() { ++top; stack[top]=j; ++k; } else if (p[k]==)) {--top; if (top==-1) done=0; else ++k;} else if (p[k]==,) ++k; else { ++j; tree[j].data=p[k]; for (i=0;im;++i) tree[j].child[i]=-1; l=stack[top]; i=0; while (tree[l].child[i]!=-1) ++i; tree[l].child[i]=j; ++k; } } *length=j; } 2.5.2 树的层号表示 设j为树中的一个结点,若为j赋予的一个整数值lev(j)满足以下两个条件: (1)如果结点

文档评论(0)

文档精品 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:6203200221000001

1亿VIP精品文档

相关文档