[菜鸟提问]关于树的输出问题

lzero13199 2009-04-26 01:05:29
老师让广义表建树 然后输出 主要是还要输出树形
我存在以下几个问题:
1.二叉树倒还好,因为就左孩子右孩子就好,树的结点创建时就俩指针,而普通的树应该怎么创建结点呢?
2.对于这个树形 很是困惑 不知道该怎么输出 。。。还是要死板的利用格式控制还是怎样吗?
在此诚恳求助各位大虾!
另外 如果有完整的树形输入输出的更是感激不尽那。。。。。
...全文
90 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
acdbxzyw 2009-04-27
  • 打赏
  • 举报
回复
多个孩子结点的树 可以用递归实现
这样比较方便
na2650945 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lzero1319 的回复:]
辛苦您了 这么长的代码 。。。。。虽然是二叉树,不过还是非常感谢
不过您好像把我的问题复杂化了,我只是要输出树形,就是输出树的样子即可。不要这么多选项一类,也不需要遍历
还是真心感谢您!
[/Quote]
个人理解啊。
试试用循环加空格。
lzero13199 2009-04-27
  • 打赏
  • 举报
回复
辛苦您了 这么长的代码 。。。。。虽然是二叉树,不过还是非常感谢
不过您好像把我的问题复杂化了,我只是要输出树形,就是输出树的样子即可。不要这么多选项一类,也不需要遍历
还是真心感谢您!
hua_zhixing_ 2009-04-26
  • 打赏
  • 举报
回复
#include<iostream>
#include<string>
using namespace std;
#define MAXLEN 100
typedef struct bt //定义二叉树结构体
{
char data;
bt* lchild;
bt* rchild;
}bt;

bt *createBt(void);
void showTree(bt *t);
void preorder(bt *t);
void postorder(bt *t);
void levelorder(bt *t);
void inorder(bt *t);
int leafnum(bt *t);
int nodenum(bt *t);
int treeDepth(bt *t);
void printTree(bt *t);
int count;//定义计算结点个数的变量

int main() //树子系统主函数
{
bt *t=NULL;
char ch1,ch2,a;
ch1='y';
while(ch1=='y'||ch1=='Y')
{
printf("\n\n\n\n");
printf("\t\t\t 二叉树子系统\n");
printf("\n\t\t************************************");
printf("\n\t\t* 1-------建 二 叉 树 *");
printf("\n\t\t* 2-------凹 入 显 示 *");
printf("\n\t\t* 3-------先 序 遍 历 *");
printf("\n\t\t* 4-------中 序 遍 历 *");
printf("\n\t\t* 5-------后 序 遍 历 *");
printf("\n\t\t* 6-------层 次 遍 历 *");
printf("\n\t\t* 7-------求 叶 子 数 *");
printf("\n\t\t* 8-------求 结 点 数 *");
printf("\n\t\t* 9-------求 树 深 度 *");
printf("\n\t\t* x-------打印二叉树 *");
printf("\n\t\t* 0-------返 回 *");
printf("\n\t\t************************************");
printf("\n\n\t\t请选择菜单号(0--9):");
cin>>ch2;
switch(ch2)
{
case '1':
printf("\n\t\t请输入按先序建立二叉树的结点序列:");
printf("\n\t\t说明:‘00’代表后继结点为空,逐个输入,按回车输入下一结点。");
printf("\n\t\t请输入根结点:");
t=createBt();
printf("\n\t\t二叉树成功建立!\n");break;
case '2':showTree(t);break;
case '3':
printf("\n\t\t该二叉树的先序遍历序列为:");
preorder(t);break;
case '4':
printf("\n\t\t该二叉树的中序遍历序列为:");
inorder(t);break;
case '5':
printf("\n\t\t该二叉树的后序遍历序列为:");
postorder(t);break;
case '6':
printf("\n\t\t该二叉树的层次遍历序列为:");
levelorder(t);break;
case '7':
count=0;leafnum(t);
printf("\n\t\t该二叉树有%d个叶子。\n",count);break;
case '8':
count=0;nodenum(t);
printf("\n\t\t该二叉树总共有%d个结点。\n",count);break;
case '9':
printf("\n\t\t该树的深度是:%d",treeDepth(t));break;
case 'x':cout<<"\n\t\t该二叉树为:";printTree(t);break;
case '0':
ch1='n';break;
default:
printf("\n\t\t***请注意:输入有误!***");
}
if(ch2!='0')
{
printf("\n\n\t\t按回车键继续,按任意键返回主菜单!\n");
a=getchar();
if(a!='\xA')//??????????????
{ getchar(); ch1='n'; }
}
}
return 1;
}

bt *createBt(void) //建立二叉树
{
bt *t=NULL;
char x;
cin>>x;
getchar();//接受回车符
if(x!='#')
{
t=new bt;
t->data=x;
printf("\n\t\t请输入%c结点的左子结点:",t->data);
t->lchild=createBt();
printf("\n\t\t请输入%c结点的右子结点:",t->data);
t->rchild=createBt();
}
else t=NULL;
return t;
}

void preorder(bt *t) //先序遍历
{
if(t)
{
cout<<t->data;
preorder(t->lchild);
preorder(t->rchild);
}
}

void inorder(bt *t) //中序遍历
{
if(t)
{
inorder(t->lchild);
cout<<t->data;
inorder(t->rchild);
}
}

void postorder(bt *t) //后序遍历
{
if(t)
{
postorder(t->lchild);
postorder(t->rchild);
cout<<t->data;
}
}

void levelorder(bt *t) //层次遍历????????????????????
{
int i,j;
bt *q[100],*p;
p=t;
if(p!=NULL)
{ i=1; q[i]=p; j=2; }
while(i!=j)
{
p=q[i];
cout<<p->data;
if(p->lchild!=NULL)
{ q[j]=p->lchild; j++;}
if(p->rchild!=NULL)
{ q[j]=p->rchild; j++; }
i++;
}
}

int leafnum(bt *t) //求叶结点数
{

if(t)
{
if(t->lchild==NULL && t->rchild==NULL)
count++;
leafnum(t->lchild);
leafnum(t->rchild);
}
return count;
}

int nodenum(bt *t) //求二叉树总结点数
{

if(t)
{
count++;
nodenum(t->lchild);
nodenum(t->rchild);
}
return count;
}

int treeDepth(bt *t) //求树深度
{
int ldep,rdep;
if(t==NULL) return 0;
else
{
ldep=treeDepth(t->lchild);
rdep=treeDepth(t->rchild);
if(ldep>rdep) return ldep+1;
else return rdep+1;
}
}

void showTree(bt *t) //凹入法显示二叉树?????
{
bt *stack[MAXLEN],*p;
int level[MAXLEN][2],top,n,i,width=4;
if(t!=NULL)
{
printf("\n\t\t二叉树的凹入表示法:\n\t\t");
top=1;
stack[top]=t; //根结点入栈
level[top][0]=width;
while(top>0)
{
p=stack[top];//退栈并显示结点的从值
n=level[top][0];
for(i=1;i<=n;i++) //n为显示宽度,字符以右对齐显示
printf(" ");
cout<<p->data;
for(i=n+1;i<50;i+=2)
printf("▃");
printf("\n\t\t");
top--;
if(p->rchild!=NULL) //左子树根结点入栈
{
top++;
stack[top]=p->rchild;
level[top][0]=n+width; //显示宽度增加width
level[top][1]=2; //左子树根结点入栈
}
if(p->lchild!=NULL) //右子树根结点入栈????????????
{
top++;
stack[top]=p->rchild;
level[top][0]=n+width; //显示宽度增加width
level[top][1]=2; //左子树根结点入栈
}
}
}
}



void printTree(bt *t){
if(t){
cout<<t->data;
if(t->lchild||t->rchild)
cout<<"(";
printTree(t->lchild);
if(t->lchild && t->rchild)
cout<<",";
printTree(t->rchild);
if(t->lchild || t->rchild)
cout<<")";
}
}
HeSWWW 2009-04-26
  • 打赏
  • 举报
回复
指针?动态组织节点的大小……
lzero13199 2009-04-26
  • 打赏
  • 举报
回复
是 孩子数不确定
您的意思是 怎么设多个结点呢?
能否具体点。。。。。
mengde007 2009-04-26
  • 打赏
  • 举报
回复
普通的树?
楼主意指孩子的数目不确定吗;如果是这样你可以多设几个节点;有些节点可以不用;
liliangbao 2009-04-26
  • 打赏
  • 举报
回复
帮顶~

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧