多叉树(左兄弟右孩子二叉树)的树形显示

核心代码

void positionadd(Multiway_tree*root, int n)
{
if (!root)return;
Multiway_tree*pcur = root;
stack<Multiway_tree*>s;
while (pcur || !s.empty())
{
if (pcur)
{
if (pcur == root->brother)break;
pcur->positon += n;
s.push(pcur);
pcur = pcur->child;
}
else
{
pcur = s.top();
s.pop();
pcur = pcur->brother;
}
}
}
void Multiway_tree::display(Multiway_tree *root, const int distance)
{ if (root == NULL)
return; root->positon = 0;
root->positionmark = " ";
int *namenum = new int[sum];
stack<Multiway_tree*>s;
Multiway_tree *pcur;
pcur = root;
int gener = 0; while (pcur || !s.empty())
{
if (pcur)
{
if (pcur->generation > gener)gener = pcur->generation;
if (gener)
s.push(pcur);
pcur = pcur->child;
}
else
{
pcur = s.top();
s.pop();
pcur = pcur->brother;
}
} Multiway_tree **p1 = new Multiway_tree*[gener + 1]; for (int i = 0; i < gener + 1; ++i)
p1[i] = 0;
pcur = root;
while (pcur || !s.empty())
{
if (pcur)
{ if (!(p1[pcur->generation]))p1[pcur->generation] = pcur;
else { Multiway_tree*t = p1[pcur->generation]; while (t->next)t = t->next; t->next = pcur; } namenum[pcur->num] = pcur->name.size() ; if (pcur->parent)
if (pcur->parent->child == pcur)
{
Multiway_tree*t = pcur;
if (pcur->brother)pcur->positionmark = "/";
else pcur->positionmark = "|";
t->parent->childrennum++;
while (t->brother)
{
t->parent->childrennum++;
t->brother->positionmark = "|";
t = t->brother;
}
if (t != pcur)t->positionmark = "\\";
} s.push(pcur);
pcur = pcur->child;
}
else
{
pcur = s.top();
s.pop();
pcur = pcur->brother;
}
} pcur = root;
pcur->positon = 0;
while (pcur || !s.empty())
{
if (pcur)
{
if (pcur->parent)
{
int n = 0;
if (pcur->parent->child == pcur)
{
Multiway_tree*t = pcur;
pcur->positon = 0;
while (t->brother)
{
t->brother->positon = t->positon + namenum[t->num] + distance;
t = t->brother;
} int g = t->parent->positon + (namenum[t->parent->num]) / 2 - (t->positon + namenum[t->num]) / 2; if (t->parent->childrennum == 1)pcur->positon = pcur->parent->positon + namenum[pcur->parent->num] / 2 - namenum[pcur->num] / 2;
else pcur->positon = g;
t = pcur;
while (t->brother)
{
t->brother->positon += g;
t = t->brother;
} } }
s.push(pcur);
pcur = pcur->child;
}
else
{
pcur = s.top();
s.pop();
pcur = pcur->brother;
}
}
for (int i = gener; i > 0; --i)
{ for (Multiway_tree*t1 = p1[i]; t1->next; t1 = t1->next)
{
if (t1->parent->child != t1)continue;
for (Multiway_tree*t2 = t1->next; t2; t2 = t2->next)
{
if (t2->parent == t1->parent)continue;
else
{
Multiway_tree*t1n = t1;
while (t1n->brother)t1n = t1n->brother;
Multiway_tree*t2n = t2;
while (t2n->brother)t2n = t2n->brother;
if (!
((t1->positon >= (t2n->positon + namenum[t2n->num])) || (t2->positon >= (t1n->positon + namenum[t1n->num])))
)
{
int d = 0;
abs(t1->parent->child->positon - t2n->positon - namenum[t2n->num]) > abs(t2->parent->child->positon - t1n->positon - namenum[t1n->num])
? abs(t2->parent->child->positon - t1n->positon - namenum[t1n->num]) : abs(t1->parent->child->positon - t2n->positon - namenum[t2n->num]); Multiway_tree*t1p = t1, *t2p = t2;
while (t1p->parent != t2p->parent)
{ t1p = t1p->parent; t2p = t2p->parent; }
int n = 0; Multiway_tree*temp = t1p; for (temp = t1p, n = 0; temp != t2p && temp; temp = temp->brother)
++n;
if (temp != t2p)
{
for (temp = t2p, n = 0; temp != t1p && temp; temp = temp->brother)
++n;
d = abs(t1->parent->child->positon - t2n->positon - namenum[t2n->num]);
}
else {
d = abs(t2->parent->child->positon - t1n->positon - namenum[t1n->num]);
} //4??? int averaged = (d + distance) / n + 1; if (t1p->parent->childrennum % 2 == 0)
{
int childn = 0;
temp = t1p->parent->child;
while (temp)
{
childn++;
int t = averaged*(childn - t1p->parent->childrennum / 2) - averaged / 2;
positionadd(temp, t);
temp = temp->brother; }
} else
{ int childn = 0;
temp = t1p->parent->child;
while (temp)
{
childn++;
int t = averaged*(childn - (t1p->parent->childrennum + 1) / 2); positionadd(temp, t); temp = temp->brother; } } } } } }
} int minposition = INT_MAX;
pcur = root;
while (pcur || !s.empty())
{
if (pcur)
{ if (minposition > pcur->positon)
minposition = pcur->positon; s.push(pcur);
pcur = pcur->child;
}
else
{
pcur = s.top();
s.pop();
pcur = pcur->brother;
}
}
positionadd(root, -1 * minposition + 1);
COORD info = GetLargestConsoleWindowSize(GetStdHandle(STD_OUTPUT_HANDLE));
if (root->positon < info.X / 4); positionadd(root, info.X / 4 - root->positon); string *output = new string[(gener + 1) * 3];
for (int i = 0; i < (gener + 1) * 3; ++i)
output[i].append(119, ' ');
for (int i = 1; i < gener + 1; ++i)
{ for (Multiway_tree *temp = p1[i]; temp; temp = temp->next)
{
string t = temp->name ;
output[i].replace(temp->positon, namenum[temp->num], t);
output[i + gener].replace(temp->positon + namenum[temp->num] / 2, 1, (temp->positionmark)); output[i + gener * 2].replace(temp->positon + namenum[temp->num] / 2, to_string(temp->num).size(), to_string(temp->num)); }
}
for (int i = 1; i < gener + 1; ++i)
{ cout << output[i + gener * 2] << endl << output[i] << endl << endl;
if (i != gener)cout << output[i + 1 + gener] << endl << endl;
} }

  下载地址

https://download.csdn.net/download/li_haoren/10336965

perorder.txt inorder.txt 分别是对本质的二叉树的前序和中序遍历保存的文件

c++实现多叉树树形显示(适合家谱的显示)的更多相关文章

  1. Xcode模拟器不显示SDK版本,反而显示设备ID的解决办法

    今天在应用程序中修改了Xcode app 的名称,结果导致Xcode模拟器不显示SDK版本,反而显示设备ID了,感觉特别的忧伤......如图: 进到Xcode->window->Devi ...

  2. iframe 内显示的网页 只显示改网页的某一部分!

    使用iframe调用指定网页的特定位置(显示目标网页某区域的我想要的内容) 有些时候我们并不需要显示iframe标签属性src指定的目标网页的所有内容,往往只需要显示某一特定区域.现有两种实现方法提供 ...

  3. ssh连接linux服务器只显示-bash-4.1#不显示路径解决方法

    ssh连接linux服务器只显示-bash-4.1#不显示路径时,我们只需要修改  ~/.bash_profile文件,如果不存在这个文件,那么新建一个,增加内容  export PS1='[\u@\ ...

  4. Linux 下shell显示-bash-4.1$不显示用户名路径的解决方法

    Linux CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法   问题描述:   CentOS下新增一个用户,登录进去之后shell脚本的信息如下:     而不是我们经常看 ...

  5. CentOS下shell显示-bash-4.1#不显示用户名路径的解决方法

    CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法 问题描述: CentOS下新增一个用户,登录进去之后shell脚本的信息如下: 而不是我们经常看到的username@hos ...

  6. 解决eclipse插件svn不显示svn信息和显示的信息为数字的问题

    1.选择window-->preferences如下图 通过上面步骤svn信息便显示了 2.解决显示的信息为数字问题 选择svn-label decoration format里面的author ...

  7. favicon.ico显示,favicon显示,favicon图标显示

    favicon.ico显示,favicon显示,favicon图标显示 >>>>>>>>>>>>>>>> ...

  8. 直接拨号、将电话号码传入拨号程序、调用拨号程序、调用系统浏览器浏览网页、调用系统程序查看联系人、显示系统设置界面和显示Wi-Fi设置界面代码

    直接拨号.将电话号码传入拨号程序.调用拨号程序.调用系统浏览器浏览网页.调用系统程序查看联系人.显示系统设置界面和显示Wi-Fi设置界面代码 拨打号码的代码如下: Intent callIntent= ...

  9. .net应用程序中添加chm帮助文档打开显示此程序无法显示网页问题

    在做.net大作业时添加了chm帮助文档结果在打开时显示“此程序无法显示网页问题”,但是把帮助文档拷到别的路径下却显示正常, 经过从网上查找,终于找到了答案: (1).chm文件的路径中不能含有“#” ...

随机推荐

  1. linux 下 进程和线程的区别

    1.进程与线程 进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(CPU时间.内存等)的基本单位. 线程是进程的一个执行流,是C ...

  2. [机器学习]numpy broadcast shape 机制

    最近在做机器学习的时候,对未知对webshell检测,发现代码提示:ValueError: operands could not be broadcast together with shapes ( ...

  3. 利用 Flask+Redis 维护 IP 代理池

    代理池的维护 目前有很多网站提供免费代理,而且种类齐全,比如各个地区.各个匿名级别的都有,不过质量实在不敢恭维,毕竟都是免费公开的,可能一个代理无数个人在用也说不定.所以我们需要做的是大量抓取这些免费 ...

  4. leetcode905

    vector<int> sortArrayByParity(vector<int>& A) { vector<int> EVEN;//偶数 vector&l ...

  5. angularJS笔记之过滤器

    angular的过滤器用法: 1.模板中使用 {{expression|filter}} 也可以多个filter连用 {{expression|filter1|filter2|...}} filter ...

  6. VS2008与MATLAB R2007a混合编程配置过程

    系统平台:windows xp sp2, visual studio 2008 professional, matlab R2007a 首先,为了使matlab 能够找到vs2008编译器,需要下载以 ...

  7. laravel框架容器管理的一些要点(转)

    本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点.文章很长,但是内容应该很有用,希望有需要的朋友能看到.php经验有限,不到位的地方,欢迎帮忙指正. ...

  8. PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解

    使用Python进行数据分析,大家都会多少学习一本经典教材<利用Python进行数据分析>,书中作者使用了Ipython的交互环境进行了书中所有代码的案例演示,而书中的Ipython交互环 ...

  9. 证明3|n(n+1)(2n+1)

    [证明3|n(n+1)(2n+1)] n(n+1)(2n+1) => n(n+1)(n+2+n-1) => n(n+1)(n+2) + n(n+1)(n-1) 因为n(n+1)(n+2). ...

  10. 张超超OC基础回顾02_成员变量(属性),局部变量,全局变量的区别

    成员变量: 写在类声明的大括号中的变量, 我们称之为 成员变量(属性, 实例变量) 成员变量只能通过对象来访问 注意: 成员变量不能离开类, 离开类之后就不是成员变量 成员变量不能在定义的同时进行初始 ...