一道关于二叉树的题目

sanguine1211 2011-10-28 07:15:01
Description
在二叉树类BinaryTree中增加一个功能:实现层次遍历。

Input(levelOrder.in)
第一行一个正整数n(1<=n<=100000),表示树上结点的个数。
第二行到第n+1行每行3个正整数l,r,value,第i行表示第i-1个结点的左儿子是l号结点(0表示没有左儿子),右儿子是r号结点(0表示没有右儿子),第i-1号结点的值是value(0<=value<=100000).

Output(levelOrder.out)
输出仅一行,表示这个二叉树的层次遍历。

Sample Input

Example 1:
7
2 3 1
4 5 3
0 6 7
0 0 5
0 0 9
7 0 6
0 0 10

Example 2:
6
0 2 1
0 3 9
0 4 100
5 0 4
6 0 2
0 0 9

Sample Output

Example 1:
1 3 7 5 9 6 10

Example 2:
1 9 100 4 2 9
...全文
259 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
一名金人 2011-11-08
  • 打赏
  • 举报
回复
二叉树
gukel 2011-11-06
  • 打赏
  • 举报
回复
朋友介绍我来这里学习的,牛B人很多。问题一下就解决了
nuptxxp 2011-11-06
  • 打赏
  • 举报
回复
想了想,可以用parent数组,
读入时这样,
for (i = 1; i <= n; i++)
{
cin >> l >> r >> v;
left[i] = l;
right[i] = r;
value[i] = v;
parent[l]=parent[r]=i
parent[i]=-1;
}

然后就很简单了,直接找parent[i]等于-1的,就是根节点的编号
最后层次遍历就行了
nuptxxp 2011-11-06
  • 打赏
  • 举报
回复

[Quote=引用 4 楼 hndcwynui 的回复:]
C/C++ code

#include <iostream>

using namespace std;

const int MAXN = 1001;

int main()
{
int left[MAXN], right[MAXN], value[MAXN], qu[MAXN];
int n, l, r, v;
int qu_b, qu_e;
……
[/Quote]
2L,4L的好像读入有问题,2L怎么只读入一个,而3L怎么把1当做根节点,这不一定啊,
比如下面测试数据:
3 4 5
1 0 6
0 0 7
0 0 8
正确应该输出:6 5 7 8

我觉得题目关键是怎么合理建树,层次遍历很简单
zmr0469 2011-11-02
  • 打赏
  • 举报
回复
一个特点就是树的节点就位于存储后的坐标处。
  • 打赏
  • 举报
回复
帮顶的。。我自己也在复习这方面的。
w835369950 2011-10-29
  • 打赏
  • 举报
回复
用队列的数据结构就可以了,我几天前写过,发了另一贴上。现在我挖出来给你贴贴,我用C写的,自己看按层次遍历那个函数应该可以明白的。

//第16题:题目:输入一颗二元查找树,把它按层次遍历
//这道题我是很有感触的,记得一个月前我去面试莱科,就出过这道题,当时硬是不会
//一个月过去了,现在我可以一下就ko它,进步蛮快的(代码真的是要多写才行)
//算法思想:从队头中取结点,遍历该结点,如果它的孩子非空,把孩子加到队尾
//如此重复,直到队头等于队尾
#include<stdio.h>
#include<malloc.h>
//定义二叉树结点结构
struct node
{
int data;
struct node *left;
struct node *right;
};
typedef struct node treenode; //二叉树结点,作辅助暂存
typedef struct node * ptreenode; //二叉树

//往root为根的二叉树加入新的结点
ptreenode addtreenode(ptreenode root,int e)
{
int flag;
ptreenode current,newnode,frontcurrent;
newnode=(ptreenode)malloc(sizeof(treenode));
if(newnode==NULL)
return NULL;
else
{
newnode->data=e;
newnode->left=newnode->right=NULL;
}
current=root;
if(current==NULL)
return newnode;
else
{
while(current!=NULL)
{
frontcurrent=current;
if(newnode->data>=current->data)
{ current=current->right;
flag=1;
}
else
{ flag=0;
current=current->left;
}
}
if(flag==1)
frontcurrent->right=newnode;
else
frontcurrent->left=newnode;
}
return root;

}

//树的广度优先搜索
void bfstree(ptreenode root)
{
ptreenode p[10];//开一数组并且在逻辑上认为是队列
int f,r; //维护两个指针,一个指向其队头,一个指向其队尾
f=r=0; //队列空时,两指针相等
if(root==NULL)
return;
p[r++]=root;//把第一个根结点入队
while(f<r)//队列非空时表明遍历没结束
{
printf("%d ",p[f]->data); //遍历该结点
if(p[f]->left!=NULL) //如果存在孩子就把它入队
p[r++]=p[f]->left;
if(p[f]->right!=NULL)
p[r++]=p[f]->right;
f++;
}
}
void main()
{
while(1){
ptreenode treeroot=NULL;
int k;
do{
scanf("%d",&k);
treeroot=addtreenode(treeroot,k);//把新输入的结点加到原来树中,结点0时结束
}while(k!=0);
bfstree(treeroot);
}
}
fengchen_2113 2011-10-29
  • 打赏
  • 举报
回复
当时面试淘宝的时候也有道类似的题目,当时思路乱死了,看了2楼的程序,心里豁然开朗
hndcwynui 2011-10-29
  • 打赏
  • 举报
回复

#include <iostream>

using namespace std;

const int MAXN = 1001;

int main()
{
int left[MAXN], right[MAXN], value[MAXN], qu[MAXN];
int n, l, r, v;
int qu_b, qu_e;
int i, k;

while (cin >> n && n != 0)
{
for (i = 1; i <= n; i++)
{
cin >> l >> r >> v;
left[i] = l;
right[i] = r;
value[i] = v;
}

qu_b = 0;
qu_e = 0;
qu[qu_e] = 1;
qu_e++;
while (qu_b != qu_e)
{
k = qu[qu_b++];
cout << value[k] << " ";
if (left[k])
qu[qu_e++] = left[k];
if (right[k])
qu[qu_e++] = right[k];
}
cout << endl;
}

return 0;
}

happyperson 2011-10-28
  • 打赏
  • 举报
回复
从第二行开始,只看前2位数字,第一个2,则输出2+1行的value,第二个是3输出第4行的value,然后是4输出第5行的value,遇到0则不输出

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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