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

核心代码

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. Unity3D的坑系列:你真想发布WinPhone版吗?

    Unity 4.2加入了支持WinPhone发布,本来是一件令人开心的事情,不过最近听了Unity技术支持的一个事情后就发现,原来发布WinPhone版也是一个坑. 实际上如果你用Unity做小游戏发 ...

  2. springboot成神之——Basic Auth应用

    本文介绍Basic Auth在spring中的应用 目录结构 依赖 入口DemoApplication 验证Authenication 配置WebSecurityConfig 控制器TestContr ...

  3. temp4

  4. Flask之性能

    5.5 性能 一.不同角度的网站性能 普通用户认为的网站性能 网站性能对于普通用户来说,最直接的体现就是响应时间.用户在浏览器上直观感受到的网站响应速度,即从客户端发送请求,到服务器返回响应内容的时间 ...

  5. ulimit open files linux打开文件数设置验证

    #include <stdio.h> #include <sys/types.h> #include <fcntl.h> #include <stdlib.h ...

  6. 13-js的面向对象

    创建对象的几种常用的方式 1 . 使用Object或对象字面量创建对象 2 . 工厂模式创建对象 3 . 构造函数模式创建对象 4 . 原型模式创建对象 1 . 使用Object或对象字面量创建对象 ...

  7. Table Tennis Game 2

    Description Misha and Vanya have played several table tennis sets. Each set consists of several serv ...

  8. MySQL5.7 在CentOS 下的安装

    尝试了在版本的CentOS6.6 和CentOS7.2 下安装,在6.6下比较复杂些.特地做下记录 在CentOS7.2 下安装,需要在官网下载 mysql-5.7.16-1.el7.x86_64.r ...

  9. CSS秘密花园:多边框

    今天在查询CSS3动画相关资料时偶然发现这个,感觉有时还是挺方便的.原文链接:http://www.w3cplus.com/css3/css-secrets/multiple-borders.html ...

  10. 将.sql文件导入powerdesigner的实现方法详解

    将.sql文件导入powerdesigner的步骤是本文我们主要要介绍的内容,步骤如下: 第一步:将要导入的库的所有表的表结构(不要表数据,只要表结构)导出成一个.sql文件. 第二步:在powerd ...