题目描述:
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
输入:
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。
Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。
Ci=’l’表示第i个节点有一个左孩子,紧接着是左孩子的编号。
Ci=’r’表示第i个节点有一个右孩子,紧接着是右孩子的编号。
Ci=’z’表示第i个节点没有子孩子。
输出:
对应每个测试案例,
按照从上之下,从左至右打印出二叉树节点的值。
样例输入:
7
8 6 5 7 10 9 11
d 2 5
d 3 4
z
z
d 6 7
z
z
样例输出:
8 6 10 5 7 9 11
#include<stdio.h>
#include<stdlib.h>
struct BTNode
{
int data;
int rchild;
int lchild;
};
struct Node
{
struct BTNode data;
struct Node* pNext;
};
struct Queue
{
struct Node* front;//队列头指针
struct Node* rear; //队列尾指针
};
//创建一个空队列
Queue* createQueue()
{
Queue* queue= (Queue*)malloc(sizeof(Queue));
queue->front=(Node*)malloc(sizeof(Node));
if(!queue||!queue->front)
{
printf("queue or front malloc faild");
exit(-1);
}
else
{
queue->rear=queue->front;//队列头指针和尾指针指向一起
queue->front-> pNext=NULL;
}
return queue;
}
bool isEmpty(Queue* queue)
{
if(queue->front==queue->rear)
return true;
else
return false;
}
//进队列操作
void enQueue(Queue* queue,BTNode e)
{
Node* pNew= (Node*)malloc(sizeof(Node*));
if(!pNew)
{
printf("pNew malloc failed");
exit(-1);
}
else
{
pNew->data=e;
pNew->pNext=NULL;
queue->rear->pNext=pNew;
queue->rear=pNew;
}
}
bool deQueue(Queue* queue,BTNode* pData)
{
if(isEmpty(queue)){
return false;
}
else
{
Node* p = queue->front->pNext;
*pData=p->data;
queue->front->pNext=p->pNext;
if(queue->rear==p)
queue->rear=queue->front;
//free(p);
}
return true;
}
void destroyQueue(Queue* queue)
{
if(isEmpty(queue))
return;
else
{
while(queue->front)
{
queue->rear=queue->front->pNext;
free(queue->front);
queue->front=queue->rear;
}
}
//free(queue);
queue=0;
return;
}
void levelTraverse(BTNode* pTree,int index,int * levelTra,int n)
{
if(pTree==NULL)
return ;
if(index==-1)
return;
BTNode pBTNode;
Queue * queue=createQueue();
enQueue(queue,pTree[0]);
int i=0;
while(!isEmpty(queue)&&i<n)
{
deQueue(queue,&pBTNode);
levelTra[i++]=pBTNode.data;
if(pBTNode.lchild!=-1)
enQueue(queue,pTree[pBTNode.lchild]);
if(pBTNode.rchild!=-1)
enQueue(queue,pTree[pBTNode.rchild]);
}
destroyQueue(queue);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
BTNode *pTree=NULL;
if(n>0)
{
pTree=(BTNode*)malloc(n*sizeof(BTNode));
if(pTree==NULL)
exit(-1);
int i,data;
for(i=0;i<n;i++)
{
scanf("%d",&data);
pTree[i].data=data;
pTree[i].rchild=-1;
pTree[i].lchild=-1;
}
for(i=0;i<n;i++)
{
char ch;
while(getchar()!='\n')
continue;
scanf("%c",&ch);
if(ch=='z')
continue;
else if(ch=='l')
{
int lindex;
scanf("%d",&lindex);
pTree[i].lchild=lindex-1;
}
else if(ch=='r')
{
int rindex;
scanf("%d",&rindex);
pTree[i].rchild=rindex-1;
}
else if(ch=='d')
{
int lindex,rindex;
scanf("%d",&lindex);
scanf("%d",&rindex);
pTree[i].lchild=lindex-1;
pTree[i].rchild=rindex-1;
}
}
}
int levelTra[n];
levelTraverse(pTree,0,levelTra,n);
int i;
for(i=0;i<n;i++)
{
if(i==n-1)
printf("%d\n",levelTra[i]);
else
printf("%d",levelTra[i]);
}
free(pTree);
pTree=NULL;
}
return 0;
}
结果:
分享到:
相关推荐
分行从上往下打印二叉树.md
不分行从上往下打印二叉树.md
java基础面试题从上往下打印二叉树本资源系百度网盘分享地址
从上往下打印二叉树C++,层序遍历。
python python_剑指offer第22题从上往下打印二叉树
剑指Offer - 22 - 从上往下打印二叉树题目链接题目从上往下打印出二叉树的每个节点,同层节点从左至右打印。直接上二叉树层次遍历代码即可。代码:publi
二叉树层次遍历,java基础面试题从上往下层次遍历打印二叉树含解析和答案,感兴趣的同学可以下载学习方便面试
在这个场景中,我们要讨论的是从上往下打印二叉树的每个节点,同层节点从左至右的打印方式,这实际上对应于二叉树的层次遍历(也称为宽度优先搜索,BFS)。 在PHP中,我们可以利用队列的数据结构来实现层次遍历。...
用队列实现从上到下打印二叉树每个节点,同一层的节点按照从左到右的顺序打印。用C++实现。
在《剑指Offer》中,有两个相关的题目,分别是“从上往下打印二叉树”和“把二叉树打印成多行”。两个问题的目标都是层次遍历二叉树,但输出格式略有不同。 1. **从上往下打印二叉树**: - 给定一个二叉树,例如 `...
# Python实现《剑指offer》 部分代码自己添加了一些测试用例, 或者自己添加了一些功能 1. 初级程序员注重算法和数据结构 2. 事先做好准备,对工作有热情 3. 面试过程放松。不要急于写代码,了解清楚所要解决的问题,...
引入一个队列,每次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾,取出队列头部的最早进入队列的节点。self.left = Non
1.从队列中取出一个元素 2.访问该元素所指的结点 3.若该元素所指结点的左、右孩子结点非空,则将其左、右孩子的指针顺序入队
从上往下打印出二叉树的每个节点,同层节点从左至右打印。 基本思路 本题考查了对数据结构的熟悉程度。 通过队列我们可以很方便地实现本题。具体操作: 如果对列不为空,则获取并打印队列头,然后将队列头的左右非...
本资源介绍了一种特殊的二叉树打印算法,即横向打印二叉树结构。该算法将二叉树的根节点放在屏幕的最左边,左子树在屏幕的下边,右子树在屏幕的上边。 二叉树的定义 一个二叉树是由一个根节点和两个子树组成的,每...
层次遍历按照从上到下、从左到右的顺序逐层访问所有节点。对于打印二叉树,我们可以使用队列(queue)来实现这一过程。以下是一个简单的层次遍历实现步骤: 1. 初始化一个空队列,将根节点放入队列。 2. 当队列不为...
1.不分行从上到下打印二叉树 2.分行从上到下打印二叉树 3.之字形打印二叉树 1.添加元素: 2.删除元素 1.添加元素 2.删除元素 3.返回元素,不删除
这是一个在字符环境中,用ASCII码打印二叉树形状的算法。 在Linux控制台下写的例题,在DOS中稍有点乱。 采用层次遍法。 算法拙劣,仅供初学者做练习,(本人也是初学者,自学数据结构,刚好学到这...
c++ c++_剑指offer题解之从上到下打印二叉树