- 1、本文档共82页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
为了节省存储单元,“带右链的先根次序表示”用ltag代替了llink 从结点的次序和ltag的值完全可以推知llink。ltag为0的结点有左孩子,其llink指向存储区中该结点的下一个结点; ltag为1的结点没有左孩子,其llink为空 带右链的先根次序表示”中rlink也有冗余,可以把rlink指针替换为一个标志位rtag,成为“带双标记的先根次序表示”。其中,每个结点包括结点本身数据,以及两个标志位ltag和rtag,其结点的形式为: 由结点的先根次序以及ltag、rtag两个标志位,就可以确定树“左孩子/右兄弟”链表中结点的llink和rlink值。其中llink的确定与带右链的先根次序表示法相同。 由结点的排列次序和ltag,rtag的值就可推知rlink的值 当一个结点x的rtag为1时,它的rlink显然应为空 当一个结点x的rtag为0时,它的rlink应指向结点序列中排在结点x的子树结点后面的那个结点y 由于树的先根次序中子树结点是嵌套出现的,在顺序搜索的过程中需要嵌套处理x的所有子树,因此确定y的过程要用到栈结构 扫描到一个rtag为0的结点就将它进栈。扫描到一个ltag为1的结点就从栈顶弹出一个结点并为它设置rlink A B C D E F G H I J 图6.15 带双标记的先根次序表示法 【算法6.10】带双标记位先根次序树构造算法 // 双标记位先根次序树结点类 templateclass T class DualTagTreeNode { public: T info; // 结点数据信息 int ltag; // 左标记 int rtag; // 右标记 DualTagTreeNode(); // 构造函数 virtual ~DualTagTreeNode(); // 析构函数 }; // 利用带双标记位的先根次序表示构造左孩子右兄弟表示的树 template class T TreeT::Tree(DualTagTreeNodeT *nodeArray, int count) { using std::stack; // 使用STL中的栈 stackTreeNodeT* aStack; TreeNodeT *pointer = new TreeNodeT; // 准备建立根结点 root = pointer; for (int i = 0; i count-1; i++) {// 处理一个结点 pointer-setValue(nodeArray[i].info); // 结点赋值 if (nodeArray[i].rtag == 0) // 若右标记为0则将结点压栈 aStack.push(pointer); else pointer-setSibling(NULL); // 若右标记为1则将兄弟指针设为空 TreeNodeT *temppointer = new TreeNodeT; if (nodeArray[i].ltag == 0) // 如果左标记为0则设置一个孩子结点 pointer-setChild(temppointer); else {// 若左标记为1 pointer-setChild(NULL); // 孩子指针设为空 pointer = aStack.top(); // 取栈顶元素 aStack.pop(); pointer-setSibling(temppointer); // 为其设置一个兄弟结点 } pointer = temppointer; } pointer-setValue(nodeArray[count-1].info); pointer-setChild(NULL); pointer-setSibling(NULL); } 在带度数的后根次序表示中,结点按后根次序顺序存储在一片连续的存储单元中,结点的形式为 其中info是结点的数据,degree是结点的度数 图6.16 带度数的后根次序表示法 A B C D E F G H I J 这种表示法不包括指针,但它仍能完全反映树的结构 由于在后序序列中每一棵子树的结点都存储在一起,且每一棵子树在后序序列中的最后一个位置存储这棵子树的根结点,那么将带度数的后根次序表示转化成森林的逻辑结构时,只需要从左至右进行扫描,度数为零的结点是叶子结点(当然也可以看作是一棵子树的根),当遇到度数非零(设为k)的结点时,则排在该结点之前且离它最近的k个子树的根就是该结点的k个子结点 类似于带双标记的先根次序表示,引入带双
文档评论(0)