尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
根据广义表建立对应二叉树(子女兄弟链表表示)并由二叉树输出对应广义表(子女兄弟链表表示)的C++非递归算法
根据输入的广义表建立子女右兄弟链的二叉树表示该二叉树对应于广义表对应的普通树。先考虑更复杂的情形如果广义表中存在共享表则将其转换为带共享子树的二叉树表示每一共享子树带有附加头节点其左链指针指向共享子树最后输出带共享子树的子女右兄弟链表示(广义表形式)C代码#include iostream #include stack #include string #include map #include vector using namespace std; class Dnode //二叉树节点类 { public: char data; Dnode* left; Dnode* right; Dnode(char d \0) :data(d), left(nullptr), right(nullptr) {} }; class info { public: vectorint left; vectorint right; Dnode* share nullptr; vectorint::size_type position 0; }; int Searchd(Dnode* ptr, int d); void creatsharelist(string glist, mapstring, info sharelist); mapstring, info::iterator Searchshare(int left, mapstring, info sharelist); int main() { cout 请输入广义表字符串形式 endl; string glist; cin glist; //输入广义表 mapstring, info sharelist; creatsharelist(glist, sharelist); stackDnode* arrange; Dnode* ptr nullptr; mapstring, info::iterator p; for (string::size_type i 0; i ! glist.size(); i) //由广义表建子女右兄弟链二叉树 { if (glist[i] () { if (i 0) { ptr new Dnode(); arrange.push(ptr); } else { Dnode* temp new Dnode(); if (arrange.top() ptr) { if (arrange.size() ! 1) { p Searchshare(i 1, sharelist); if (p ! sharelist.end()) { p-second.share temp; } } ptr-left temp; } else { ptr-right temp; } ptr temp; if (glist[i 1] ! )) { p Searchshare(i 1, sharelist); if (p ! sharelist.end()) { if (p-second.share ! nullptr) { i p-second.right[p-second.position - 1] - 1; temp-left p-second.share; continue; } } } arrange.push(ptr); } } else { if (glist[i] )) { ptr arrange.top(); arrange.pop(); } else { if (glist[i] ! ,) { Dnode* temp new Dnode(glist[i]); if (ptr arrange.top()) { ptr-left temp; } else ptr-right temp; ptr temp; } } } } //ptr指向二叉树根节点 cout 已将广义表字符串形式转化为子女右兄弟链表示 endl; cout 子女右兄弟链表示对应的广义表形式为:; cout (; int d 0; Dnode* const dest ptr; while (true) //输出子女右兄弟链二叉树对应广义表形式 { if (Searchd(ptr, d) 0) { if (ptr dest) { if (d 0) cout ); break; } else { if (d 0) { if (ptr-data \0) cout (); else cout ptr-data; cout ); } else { cout ); } ptr arrange.top(); d 1; arrange.pop(); } } else { Dnode* interval nullptr; if (d 0) { if (ptr-left ! nullptr) { if (ptr ! dest) cout (; arrange.push(ptr); interval ptr-left; } else { if (ptr-data \0) { cout (); } else { cout ptr-data; } cout ,; interval ptr-right; } } else { cout ,; interval ptr-right; } d 0; ptr interval; } } return 0; } int Searchd(Dnode* ptr, int d) { if (d 2) return 0; else { if (d 1) { if (ptr-right nullptr) return 0; else return 2; } else { if (ptr-left ! nullptr) return 1; else { if (ptr-right ! nullptr) return 2; else return 0; } } } } void creatsharelist(string glist, mapstring, info sharelist) { vectorint stack; int total 0; for (const auto s : glist) { total; if (s () { stack.push_back(total); } else if (s )) { string temp glist.substr(stack.back() - 1, total - stack.back() 1); auto r sharelist.insert(make_pair(temp, info())).first; r-second.left.push_back(stack.back()); r-second.right.push_back(total); stack.pop_back(); } } auto m sharelist.begin(); while (m ! sharelist.end()) { if (m-second.left.size() 1 || m-first ()) m sharelist.erase(m); else m; } } mapstring, info::iterator Searchshare(int left, mapstring, info sharelist) { auto p sharelist.begin(); for (; p ! sharelist.end(); p) { if (p-second.left.size() ! p-second.position p-second.left[p-second.position] left) { p-second.position; return p; } } return p; }运行结果:广义表无共享表情形相对简单#include stdafx.h #include iostream #include stack #include string using namespace std; class Dnode { public: char data; Dnode *left; Dnode *right; Dnode(char d \0) :data(d), left(nullptr), right(nullptr) {} }; int Searchd(Dnode *ptr, int d); int main() { cout 请输入广义表字符串形式 endl; string glist; cin glist; stackDnode * arrange; Dnode *ptr nullptr; for (string::size_type i 0; i ! glist.size(); i) { if (glist[i] () { if (i 0) { ptr new Dnode(); arrange.push(ptr); } else { Dnode *temp new Dnode(); if (arrange.top() ptr) { ptr-lefttemp; } else { ptr-right temp; } ptr temp; arrange.push(ptr); } } else { if (glist[i] )) { ptr arrange.top(); arrange.pop(); } else { if (glist[i] ! ,) { Dnode *temp new Dnode(glist[i]); if (ptr arrange.top()) ptr-left temp; else ptr-right temp; ptr temp; } } } } //ptr指向二叉树根节点 cout 已将广义表字符串形式转化为子女右兄弟链表示 endl; cout 子女右兄弟链表示对应的广义表形式为:; cout (; int d 0; Dnode *const dest ptr; while (true) { if (Searchd(ptr, d) 0) { if (ptr dest) { if (d0) cout ); break; } else { if (d 0) { if (ptr-data \0) cout (); else cout ptr-data; cout ); } else { cout ); } ptr arrange.top(); d 1; arrange.pop(); } } else { Dnode *interval nullptr; if (d 0) { if (ptr-left ! nullptr) { if (ptr ! dest) cout (; arrange.push(ptr); interval ptr-left; } else { if (ptr-data \0) { cout (); } else { cout ptr-data; } cout ,; interval ptr-right; } } else { cout ,; interval ptr-right; } d 0; ptr interval; } } return 0; } int Searchd(Dnode *ptr, int d) { if (d 2) return 0; else { if (d 1) { if (ptr-right nullptr) return 0; else return 2; } else { if (ptr-left ! nullptr) return 1; else { if (ptr-right ! nullptr) return 2; else return 0; } } } }运行结果
RELATED

相关推荐

机试刷题(常见)

机试刷题(常见)

1、数组中的最长连续子序列给定无序数组arr,返回其中最长的连续序列的长度(要求值连续,位置可以不连续,例如 3,4,5,6为连续的自然数)Python# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即…

📅 2026/10/17 14:59:36
多叉树的运算

多叉树的运算

以以下4叉树为例(K4)结点旁的数字代表结点数据域中存放的值&#xff0c;ROOT表示根结点&#xff0c;根结点数据域为0问题&#xff1a;求K叉树叶子结点的数目和深度解答(C):#include <iostream> #include <vector> #include <stdio.h> #include <malloc.h&…

📅 2026/9/8 0:34:43
2021年wordpress国内最好用的网站优化插件

2021年wordpress国内最好用的网站优化插件

互联网真是风云变幻&#xff0c;2021年原本对CMSdede不追溯版权收费今年也突然开始割韭菜了&#xff0c;各种大小网络公司都开始转wordpress的框架&#xff0c;这个框架属于是国外公益组织集体创造的不会要求版权问题&#xff0c;所以大家都已经开始转型。 这年头&#xff0c;干…

📅 2026/10/24 14:14:59
MORE NEWS

更多资讯

📰

济南电工证啥时候考的?考前押题助你少走弯路

济南电工证啥时候考的?考前押题助你少走弯路 不知道去哪报名怕被中介坑,济南电工证啥时候考的?这是很多想考证的小伙伴最头疼的问题。网上一搜信息五花八门,有些地方收费高得离谱,还有些培训机构不靠谱,拿钱不办事,耽误时间不说,还可能影响你的职业生…

📰

低压电工证理论考几题别怕挂科 电子证书怎么考更稳妥

低压电工证理论考几题别怕挂科 电子证书怎么考更稳妥 怕考不过白交培训费?你不是一个人。去年郑州一家建筑公司就有3个工人因为理论考试不及格,培训费打了水漂。其实低压电工证理论考试 总共60题 ,考前掌握重点就能稳过。更关键的是,现在…

📰

黄陵县高低压电工证怎么考?上岗必备全流程避坑指南

黄陵县高低压电工证怎么考?上岗必备全流程避坑指南 你是不是也遇到过这种情况:想在工地、工厂或者电力相关单位找一份稳定的电工工作,结果被告知“ 必须有黄陵县高低压电工证…

📰

南通电工证发证单位考前押题怎么搞?工地太忙根本没时间复习考试

南通电工证发证单位考前押题怎么搞?工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这是很多一线电工的真实写照。特别是像你这种在驻马店干建筑的,天天扛着工具、爬架子、接电线,哪还有空去琢磨考前押题?但别小看这张南通电工证发证单位发的低…

📰

电工证考试及格线你知道多少?值不值得考

电工证考试及格线你知道多少?值不值得考 不知道去哪报名怕被中介坑?你不是一个人。南阳卧龙区从事房建工程的师傅们,几乎每个人都遇到过这种烦心事。电工证考试及格线是多少?值不值得考?今天就来聊清楚,帮你避坑。…

📰

低压电工作业证书报名怎么报名?证书过期了不知道怎么复审延期

低压电工作业证书报名怎么报名?证书过期了不知道怎么复审延期 证书过期了不知道怎么复审延期?低压电工作业证书报名怎么报名?这是很多电工师傅在实际工作中遇到的难题。尤其是在信阳浉河区,很多劳务班组负责人为了确保施工安全和合法合规,必须为班组成员…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬