c++实现多叉树树形显示(适合家谱的显示)


多叉树(左兄弟右孩子二叉树)的树形显示
核心代码
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++实现多叉树树形显示(适合家谱的显示)的更多相关文章
- Xcode模拟器不显示SDK版本,反而显示设备ID的解决办法
今天在应用程序中修改了Xcode app 的名称,结果导致Xcode模拟器不显示SDK版本,反而显示设备ID了,感觉特别的忧伤......如图: 进到Xcode->window->Devi ...
- iframe 内显示的网页 只显示改网页的某一部分!
使用iframe调用指定网页的特定位置(显示目标网页某区域的我想要的内容) 有些时候我们并不需要显示iframe标签属性src指定的目标网页的所有内容,往往只需要显示某一特定区域.现有两种实现方法提供 ...
- ssh连接linux服务器只显示-bash-4.1#不显示路径解决方法
ssh连接linux服务器只显示-bash-4.1#不显示路径时,我们只需要修改 ~/.bash_profile文件,如果不存在这个文件,那么新建一个,增加内容 export PS1='[\u@\ ...
- Linux 下shell显示-bash-4.1$不显示用户名路径的解决方法
Linux CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法 问题描述: CentOS下新增一个用户,登录进去之后shell脚本的信息如下: 而不是我们经常看 ...
- CentOS下shell显示-bash-4.1#不显示用户名路径的解决方法
CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法 问题描述: CentOS下新增一个用户,登录进去之后shell脚本的信息如下: 而不是我们经常看到的username@hos ...
- 解决eclipse插件svn不显示svn信息和显示的信息为数字的问题
1.选择window-->preferences如下图 通过上面步骤svn信息便显示了 2.解决显示的信息为数字问题 选择svn-label decoration format里面的author ...
- favicon.ico显示,favicon显示,favicon图标显示
favicon.ico显示,favicon显示,favicon图标显示 >>>>>>>>>>>>>>>> ...
- 直接拨号、将电话号码传入拨号程序、调用拨号程序、调用系统浏览器浏览网页、调用系统程序查看联系人、显示系统设置界面和显示Wi-Fi设置界面代码
直接拨号.将电话号码传入拨号程序.调用拨号程序.调用系统浏览器浏览网页.调用系统程序查看联系人.显示系统设置界面和显示Wi-Fi设置界面代码 拨打号码的代码如下: Intent callIntent= ...
- .net应用程序中添加chm帮助文档打开显示此程序无法显示网页问题
在做.net大作业时添加了chm帮助文档结果在打开时显示“此程序无法显示网页问题”,但是把帮助文档拷到别的路径下却显示正常, 经过从网上查找,终于找到了答案: (1).chm文件的路径中不能含有“#” ...
随机推荐
- Error EBUSY: osd.0 is still up; must be down before removal的解决办法
标签(空格分隔):ceph,ceph运维,osd故障 集群环境: [root@node3 ~]# cat /etc/redhat-release CentOS Linux release 7.3.16 ...
- PL/SQL 训练12--动态sql和绑定变量
--什么是动态SQL?动态PL/SQL--动态SQL是指在运行时刻才构建执行的SQL语句--动态PL/SQL是指整个PL/SQL代码块都是动态构建,然后再编译执行 --动态SQL来可以用来干什么? - ...
- UE4动画功能整理
转自:http://blog.ch-wind.com/ue4%E5%8A%A8%E7%94%BB%E5%8A%9F%E8%83%BD%E6%95%B4%E7%90%86/ 工欲善其事必先利其器,最近一 ...
- 多路复用IO
多路复用IO(IO multiplexing) IO multiplexing这个词可能有点陌生,但是如果我说select/epoll,大概就都能明白了.有些地方也称这种IO方式为事件驱动IO (ev ...
- 阻塞IO(blocking IO)
在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: 当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据.对于n ...
- html 之表单,div标签等
一 , 表单 功能 : 表单用于向服务器传输数据, 从而实现用户与Web服务器的交互 表单能够包含input系列标签,比如文本字段,复选框 , 单选框 , 提交按钮等等. 表单还可以包含textare ...
- Java面向对象-方法的重载
Java面向对象-方法的重载 所谓方法的重载, 类里面有两个或者多个重名的方法,但是方法的参数个数.类型.顺序至少有一个不一样,这时候局构成方法重载: 上代码: package com.java123 ...
- oracle:RETURNING 子句
RETURNING 自己通常结合DML 语句使用.(INSERT UPDATE DELETE) 使用方法: UPDATE table_name SET expr1 RETURNING column_n ...
- Oracle DATABASE LINK(DBLINK)创建
数据库全局名称可以用以下命令查出: SELECT * FROM GLOBAL_NAME; 修改可以用以下语句来修改参数值: ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALS ...
- 读书笔记 Week4 2018-3-29
读书笔记 Week 4 <我是一只IT小小鸟> 首先不得不说,这周的个人编程任务占据了我绝大多数的精力.,虽然在接触到题目的第一时间就有了大致的思路,但当我真正上手开始编程的时候,却几乎每 ...