求教一道编程题(C语言的)

lin_eric 2009-04-05 08:45:55
各位大哥大姐,知道的把代码贴出来或者发到我邮箱哈!~在些先谢过啦!

给定一棵有n个结点的二叉树,结点的编号为0~n-1。请你编写程序输出二叉树的前序遍历序列。
要求:
输入的第一行是一个正整数t(1 < t < 20),表示有t组测试用例。
对于每组测试用例,第一行是一个整数n(0 < n < 20),表示二叉树结点个数。第二行是一个数r(0≤r≤n-1),二叉树根结点的编号。
后面有n-1行,表示二叉树n-1条边的信息。每行三个数a,b,c,三个数间由空格隔开,其中0≤a,b≤n-1且a≠b, c为0或1。a表示边的起点,b表示边的终点。如果c为0,表示b是a的左儿子;如果c为1,表示b是a的右儿子。对于每组测试用例输出一行,即:该二叉树的前序遍历序列,两个节点编号之间留一个空格。
...全文
273 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
joyer688 2009-04-06
  • 打赏
  • 举报
回复
关注中
lin_eric 2009-04-06
  • 打赏
  • 举报
回复
自己项一个
Paradin 2009-04-06
  • 打赏
  • 举报
回复
8楼a不了吗请问lz
坚强的豁着 2009-04-06
  • 打赏
  • 举报
回复
这道题目是关于测试的吗?
shwy0000 2009-04-06
  • 打赏
  • 举报
回复
学习下
magipan 2009-04-05
  • 打赏
  • 举报
回复
fun(arr,b,r-1);//这儿改成这样
printf("\b\n");

回复太快!如果您是恶意刷楼,将会受到严厉惩罚!
看样子最多连续发三楼么?等了一个小时再试试。。。
Paradin 2009-04-05
  • 打赏
  • 举报
回复
这个,请测下

#include <stdio.h>
#include <stdlib.h>

//二叉树节点
typedef struct tagTreeNode
{
int id;
struct tagTreeNode *left;
struct tagTreeNode *right;
} TreeNode;

void printTree(TreeNode *pNode)
{
if (pNode == NULL) return;
printf("%d ", pNode->id);
printTree(pNode->left);
printTree(pNode->right);
}

int main()
{
TreeNode nodes[21];
int t, n, rootid, i;
for (i = 0; i < 21; ++i)
nodes[i].id = i;

scanf("%d", &t);

while (t--)
{
for (i = 0; i < 21; ++i)
nodes[i].left = nodes[i].right = NULL;

scanf("%d", &n);
scanf("%d", &rootid);

for (int j = 0; j < n - 1; ++j)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if (c == 0)
nodes[a].left = &nodes[b];
else
nodes[a].right = &nodes[b];
}
printTree(&nodes[rootid]);
printf("\n");
}
return 0;
}
magipan 2009-04-05
  • 打赏
  • 举报
回复
有错。。。
magipan 2009-04-05
  • 打赏
  • 举报
回复
好像是这个意思,不过不会保存嵌套调用中产生的值,直接打出来了
#include <stdio.h>
#include <stdlib.h>

void fun(int a[][3],int b,int n)
{
int i;
printf("%d ",b);
for(i=0;i<n;i++)
{
if(a[i][0]==b && a[i][2]==0)
{//有左子树
fun(a,a[i][1],n);
}
}
for(i=0;i<n;i++)
{
if(a[i][0]==b && a[i][2]==1)
{//有右子树
fun(a,a[i][1],n);
}
}
}

int main()
{
int n,r,b,arr[20][3],i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d %d",&r,&b);
for(j=0;j<r-1;j++)
{
scanf("%d %d %d",&arr[j][0],&arr[j][1],&arr[j][2]);
}
fun(arr,b,r);
printf("\b\n");
}

system("pause");
return 0;
}
magipan 2009-04-05
  • 打赏
  • 举报
回复
好像是一个ACM题吧?忘了是哪儿的了
mengde007 2009-04-05
  • 打赏
  • 举报
回复
楼主的意思??
ies_sweet 2009-04-05
  • 打赏
  • 举报
回复
up,
学习了
  • 打赏
  • 举报
回复
就求前序遍历??
书上不是很清楚吗?


template <class T>
void PreOrder(BinaryTreeNode<T> *t)
{// 对*t进行前序遍历
if(t) {
Visit(t) ; // 访问根节点
PreOrder(t->LeftChild) ; // 前序遍历左子树
PreOrder(t->RightChild) ; // 前序遍历右子树
}
}
template <class T>
void InOrder(BinaryTreeNode<T> *t)
{// 对*t进行中序遍历
if(t) {
InOrder(t->LeftChild) ; // 中序遍历左子树
Visit(t) ; // 访问根节点
InOrder(t->RightChild) ; // 中序遍历右子树
}
}
template <class T>
void PostOrder(BinaryTreeNode<T> *t)
{// 对*t进行后序遍历
if(t) {
PostOrder(t->LeftChild) ; // 后序遍历左子树
PostOrder(t->RightChild) ; // 后序遍历右子树
Visit(t) ; // 访问根节点
}
}
cheng_fengming 2009-04-05
  • 打赏
  • 举报
回复
顶一下!

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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