【剑指offer】从上向下打印二叉树
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26089165
剑指offer上的第23题,实际上就是考察二叉树的层序遍历,详细思想能够參考这里。
- 题目描写叙述:
-
从上往下打印出二叉树的每一个节点,同层节点从左至右打印。
- 输入:
-
输入可能包括多个測试例子。输入以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
AC代码:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h> /*
二叉树的存储结构
*/
typedef struct BTNode
{
int data;
int rchild;
int lchild;
}BTNode; /*
队列的存储结构
*/
typedef struct Node
{
BTNode data;
struct Node *pNext;
}NODE,*PNODE; typedef struct Queue
{
PNODE front; //队头指针
PNODE rear; //队尾指针
}QUEUE,*PQUEUE; /*
创建一个空队列,队头指针和队尾指针都指向头结点,
头结点中不存放数据,仅仅存放指针
*/
PQUEUE create_queue()
{
PQUEUE pS = (PQUEUE)malloc(sizeof(QUEUE));
pS->front = (PNODE)malloc(sizeof(NODE));
if(!pS || !pS->front)
{
printf("pS or front malloc failed!!");
exit(-1);
}
else
{
pS->rear = pS->front;
pS->front->pNext = NULL;
}
return pS;
} /*
推断队列是否为空
*/
bool is_empty(PQUEUE pS)
{
if(pS->front == pS->rear)
return true;
else
return false;
} /*
进队函数。从队尾进队,队头指针保持不变
*/
void en_queue(PQUEUE pS, BTNode e)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(!pNew)
{
printf("pNew malloc failed");
exit(-1);
}
else
{
pNew->data = e;
pNew->pNext = NULL;
pS->rear->pNext = pNew;
pS->rear = pNew;
}
return;
} /*
出队函数。从队头出队。队尾指针保持不变,但当最后一个元素出队时,
须要对队尾指针又一次赋值,使其指向头结点
*/
bool de_queue(PQUEUE pS,BTNode *pData)
{
if(is_empty(pS))
return false;
else
{
PNODE p = pS->front->pNext;
*pData = p->data;
pS->front->pNext = p->pNext; //这里是队列头元素出队的特殊情况,普通情况下,删除队头元素时
//仅需改动头结点中的指针,但当队列中最后一个元素被删除时。
//队列尾指针也丢失了,因此需对队尾指针又一次赋值(指向头结点)。
if(pS->rear == p)
pS->rear = pS->front;
free(p);
}
return true;
} /*
销毁队列,头结点也被销毁,最后也将pS节点销毁,并将其指向为空,避免垂直指针的产生
*/
void destroy_queue(PQUEUE pS)
{
if(is_empty(pS))
return;
else
{
while(pS->front)
{
pS->rear = pS->front->pNext;
free(pS->front);
pS->front = pS->rear;
}
}
free(pS);
pS = 0;
return;
} /*
层序遍历二叉树
*/
void LevelTraverse(BTNode *pTree,int index,int *LevTraverse,int n)
{
if(pTree == NULL)
return;
if(index == -1)
return; BTNode pBTNode;
PQUEUE pS = create_queue();
en_queue(pS, pTree[0]);
int i = 0;
while(!is_empty(pS) && i<n)
{
de_queue(pS,&pBTNode);
//相同。先把元素按层序遍历的顺序保存起来
LevTraverse[i++] = pBTNode.data;
if(pBTNode.lchild != -1)
en_queue(pS, pTree[pBTNode.lchild]);
if(pBTNode.rchild != -1)
en_queue(pS, pTree[pBTNode.rchild]);
} destroy_queue(pS);
} int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
//输入树pTree各节点的值
BTNode *pTree = NULL;
if(n>0)
{
pTree = (BTNode *)malloc(n*sizeof(BTNode));
if(pTree == NULL)
exit(EXIT_FAILURE);
int i,data;
//输入n个节点的data
for(i=0;i<n;i++)
{
scanf("%d",&data);
pTree[i].data = data;
pTree[i].rchild = -1;
pTree[i].lchild = -1;
} //输入n行节点连接关系
for(i=0;i<n;i++)
{
char ci;
//这两行的作用是为了跳过缓冲区中的换行符
//这里不能用fflush(stdin),gcc不支持,这仅仅是一些编译器自加的。
//假设用了,測试系统会报RE。
while(getchar() != '\n')
continue;
scanf("%c",&ci);
if(ci == 'z')
continue;
else if(ci == 'l')
{
int lindex;
scanf("%d",&lindex);
pTree[i].lchild = lindex-1;
}
else if(ci == 'r')
{
int rindex;
scanf("%d",&rindex);
pTree[i].rchild = rindex-1;
}
else if(ci == 'd')
{
int lindex,rindex;
scanf("%d",&lindex);
scanf("%d",&rindex);
pTree[i].lchild = lindex-1;
pTree[i].rchild = rindex-1;
}
}
} //先将遍历的元素依次保存到preTraverse数组中
int *LevTraverse = (int *)malloc(n*sizeof(int));
if(LevTraverse == NULL)
exit(EXIT_FAILURE);
LevelTraverse(pTree,0,LevTraverse,n);
int i;
for(i=0;i<n;i++)
{
//使输出符合測试系统要求的格式
if(i == n-1)
printf("%d\n",LevTraverse[i]);
else
printf("%d ",LevTraverse[i]);
} free(LevTraverse);
LevTraverse = NULL; free(pTree);
pTree = NULL;
}
return 0;
}
/**************************************************************
Problem: 1523
User: mmc_maodun
Language: C
Result: Accepted
Time:0 ms
Memory:916 kb
****************************************************************/
【剑指offer】从上向下打印二叉树的更多相关文章
- 剑指offer从上往下打印二叉树 、leetcode102. Binary Tree Level Order Traversal(即剑指把二叉树打印成多行、层序打印)、107. Binary Tree Level Order Traversal II 、103. Binary Tree Zigzag Level Order Traversal(剑指之字型打印)
从上往下打印二叉树这个是不分行的,用一个队列就可以实现 class Solution { public: vector<int> PrintFromTopToBottom(TreeNode ...
- 剑指offer——从上往下打印二叉树
题目描述:从上到下打印二叉树的节点,同一层的从左到右打印 思路:采用队列来存储单层的节点,然后通过删除队列的头结点操作,依次遍历每一层. 代码为: import java.util.ArrayList ...
- 剑指Offer 从上往下打印二叉树(dfs)
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 用一个队列来辅助,先压入根节点,设置一个指针记录队列头位置,判断队头指针有没有孩子,有压入左右孩子,,,操作完一次,队头出 ...
- 用js刷剑指offer(从上到下打印二叉树)
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 牛客网链接 js代码 /* function TreeNode(x) { this.val = x; this.left = null ...
- 剑指Offer-22.从上往下打印二叉树(C++/Java)
题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 分析: 按层次打印二叉树的节点,重点就是我们在打印一层节点的时候,同时按顺序保存好当前节点的下一层节点,也就是左节点和右节点,当此层节点 ...
- 剑指offer--29.从上往下打印二叉树
层序遍历,队列 ------------------------------------------------------------------------------------- 时间限制:1 ...
- 剑指offer23 从上往下打印二叉树
没有把队列的头部弹出,出现内存错误:
- Go语言实现:【剑指offer】按之字形打印二叉树
该题目来源于牛客网<剑指offer>专题. 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. ...
- 剑指offer:按之字形打印二叉树(栈|双向队列+中序遍历)
1. 题目描述 /** 请实现一个函数按照之字形打印二叉树, 即第一行按照从左到右的顺序打印, 第二层按照从右至左的顺序打印, 第三行按照从左到右的顺序打印, 其他行以此类推. */ 2. 双向队列 ...
- 剑指Offer——按之字形顺序打印二叉树
题目描述: 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 分析: 我们都知道二叉树的层次遍历用的是队 ...
随机推荐
- Collection用法
Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Queue接 口.在队列这种数据结构中,最先插入的元素将是最先被删除的元素:反之最后插入的元素将 ...
- android中使用DisplayMetrics获取屏幕参数
--关于Density int android.graphics.Bitmap.getDensity(),返回bitmap-density(密度).默认的density就是当前display-dens ...
- jquery-1.10.2.min.js之Multiple markers at this line
1.windows-preferences 输入validation 2. 点击进入 3. 将JavaScript validator for js files 的两个对勾去了就OK! 4 ...
- CMake学习小结
假定有vegagis工程,工程的目录结构如下: #--vegagis# |--src 源文件目录# |--gui 界面工程,输出类型:dll,依赖于QT的QtCore.QtGui.QtXml ...
- Sicily-1009 梅森素数
一.梅森素数 素数有无穷多个,却只有极少量的素数能表示成2p-1(p为素数)的形式.在不大于257的素数中,当p=2.3.5.7.13.17.19.31.67.127.257时,2p-1是素数,其它都 ...
- Surround the Trees(凸包求周长)
Surround the Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 在UITouch事件中画圆圈-iOS8 Swift基础教程
这篇教程主要内容展示如何利用Core Graphics Framework画圆圈,当用户点击屏幕时随机生成不同大小的圆,这篇教程在Xcode6和iOS8下编译通过. 打开Xcode,新建项目选择Sin ...
- MDK常见错误详解集合
错误代码及错误信息 错误释义 error 1: Out of memory 内存溢出 error 2: Identifier expected 缺标识符 error 3: Unknown identi ...
- PHP - 抓取电视剧资源
<?php /** * 获取下载url * @return [type] [description] */ function getVedioDwonloadUrl() { for ($i=1; ...
- BZOJ 3401: [Usaco2009 Mar]Look Up 仰望( 单调栈 )
n <= 105 , 其实是10 ^ 5 ....坑...我一开始写了个模拟结果就 RE 了.. 发现这个后写了个单调栈就 A 了... ---------------------------- ...