转载请注明出处: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个节点没有子孩子。

输出:

相应每一个測试案例,
依照从上之下,从左至右打印出二叉树节点的值。

例子输入:
  1. 7
  2. 8 6 5 7 10 9 11
  3. d 2 5
  4. d 3 4
  5. z
  6. z
  7. d 6 7
  8. z
  9. z
例子输出:
  1. 8 6 10 5 7 9 11

AC代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<stdbool.h>
  4.  
  5. /*
  6. 二叉树的存储结构
  7. */
  8. typedef struct BTNode
  9. {
  10. int data;
  11. int rchild;
  12. int lchild;
  13. }BTNode;
  14.  
  15. /*
  16. 队列的存储结构
  17. */
  18. typedef struct Node
  19. {
  20. BTNode data;
  21. struct Node *pNext;
  22. }NODE,*PNODE;
  23.  
  24. typedef struct Queue
  25. {
  26. PNODE front; //队头指针
  27. PNODE rear; //队尾指针
  28. }QUEUE,*PQUEUE;
  29.  
  30. /*
  31. 创建一个空队列,队头指针和队尾指针都指向头结点,
  32. 头结点中不存放数据,仅仅存放指针
  33. */
  34. PQUEUE create_queue()
  35. {
  36. PQUEUE pS = (PQUEUE)malloc(sizeof(QUEUE));
  37. pS->front = (PNODE)malloc(sizeof(NODE));
  38. if(!pS || !pS->front)
  39. {
  40. printf("pS or front malloc failed!!");
  41. exit(-1);
  42. }
  43. else
  44. {
  45. pS->rear = pS->front;
  46. pS->front->pNext = NULL;
  47. }
  48. return pS;
  49. }
  50.  
  51. /*
  52. 推断队列是否为空
  53. */
  54. bool is_empty(PQUEUE pS)
  55. {
  56. if(pS->front == pS->rear)
  57. return true;
  58. else
  59. return false;
  60. }
  61.  
  62. /*
  63. 进队函数。从队尾进队,队头指针保持不变
  64. */
  65. void en_queue(PQUEUE pS, BTNode e)
  66. {
  67. PNODE pNew = (PNODE)malloc(sizeof(NODE));
  68. if(!pNew)
  69. {
  70. printf("pNew malloc failed");
  71. exit(-1);
  72. }
  73. else
  74. {
  75. pNew->data = e;
  76. pNew->pNext = NULL;
  77. pS->rear->pNext = pNew;
  78. pS->rear = pNew;
  79. }
  80. return;
  81. }
  82.  
  83. /*
  84. 出队函数。从队头出队。队尾指针保持不变,但当最后一个元素出队时,
  85. 须要对队尾指针又一次赋值,使其指向头结点
  86. */
  87. bool de_queue(PQUEUE pS,BTNode *pData)
  88. {
  89. if(is_empty(pS))
  90. return false;
  91. else
  92. {
  93. PNODE p = pS->front->pNext;
  94. *pData = p->data;
  95. pS->front->pNext = p->pNext;
  96.  
  97. //这里是队列头元素出队的特殊情况,普通情况下,删除队头元素时
  98. //仅需改动头结点中的指针,但当队列中最后一个元素被删除时。
  99. //队列尾指针也丢失了,因此需对队尾指针又一次赋值(指向头结点)。
  100. if(pS->rear == p)
  101. pS->rear = pS->front;
  102. free(p);
  103. }
  104. return true;
  105. }
  106.  
  107. /*
  108. 销毁队列,头结点也被销毁,最后也将pS节点销毁,并将其指向为空,避免垂直指针的产生
  109. */
  110. void destroy_queue(PQUEUE pS)
  111. {
  112. if(is_empty(pS))
  113. return;
  114. else
  115. {
  116. while(pS->front)
  117. {
  118. pS->rear = pS->front->pNext;
  119. free(pS->front);
  120. pS->front = pS->rear;
  121. }
  122. }
  123. free(pS);
  124. pS = 0;
  125. return;
  126. }
  127.  
  128. /*
  129. 层序遍历二叉树
  130. */
  131. void LevelTraverse(BTNode *pTree,int index,int *LevTraverse,int n)
  132. {
  133. if(pTree == NULL)
  134. return;
  135. if(index == -1)
  136. return;
  137.  
  138. BTNode pBTNode;
  139. PQUEUE pS = create_queue();
  140. en_queue(pS, pTree[0]);
  141. int i = 0;
  142. while(!is_empty(pS) && i<n)
  143. {
  144. de_queue(pS,&pBTNode);
  145. //相同。先把元素按层序遍历的顺序保存起来
  146. LevTraverse[i++] = pBTNode.data;
  147. if(pBTNode.lchild != -1)
  148. en_queue(pS, pTree[pBTNode.lchild]);
  149. if(pBTNode.rchild != -1)
  150. en_queue(pS, pTree[pBTNode.rchild]);
  151. }
  152.  
  153. destroy_queue(pS);
  154. }
  155.  
  156. int main()
  157. {
  158. int n;
  159. while(scanf("%d",&n) != EOF)
  160. {
  161. //输入树pTree各节点的值
  162. BTNode *pTree = NULL;
  163. if(n>0)
  164. {
  165. pTree = (BTNode *)malloc(n*sizeof(BTNode));
  166. if(pTree == NULL)
  167. exit(EXIT_FAILURE);
  168. int i,data;
  169. //输入n个节点的data
  170. for(i=0;i<n;i++)
  171. {
  172. scanf("%d",&data);
  173. pTree[i].data = data;
  174. pTree[i].rchild = -1;
  175. pTree[i].lchild = -1;
  176. }
  177.  
  178. //输入n行节点连接关系
  179. for(i=0;i<n;i++)
  180. {
  181. char ci;
  182. //这两行的作用是为了跳过缓冲区中的换行符
  183. //这里不能用fflush(stdin),gcc不支持,这仅仅是一些编译器自加的。
  184. //假设用了,測试系统会报RE。
  185. while(getchar() != '\n')
  186. continue;
  187. scanf("%c",&ci);
  188. if(ci == 'z')
  189. continue;
  190. else if(ci == 'l')
  191. {
  192. int lindex;
  193. scanf("%d",&lindex);
  194. pTree[i].lchild = lindex-1;
  195. }
  196. else if(ci == 'r')
  197. {
  198. int rindex;
  199. scanf("%d",&rindex);
  200. pTree[i].rchild = rindex-1;
  201. }
  202. else if(ci == 'd')
  203. {
  204. int lindex,rindex;
  205. scanf("%d",&lindex);
  206. scanf("%d",&rindex);
  207. pTree[i].lchild = lindex-1;
  208. pTree[i].rchild = rindex-1;
  209. }
  210. }
  211. }
  212.  
  213. //先将遍历的元素依次保存到preTraverse数组中
  214. int *LevTraverse = (int *)malloc(n*sizeof(int));
  215. if(LevTraverse == NULL)
  216. exit(EXIT_FAILURE);
  217. LevelTraverse(pTree,0,LevTraverse,n);
  218. int i;
  219. for(i=0;i<n;i++)
  220. {
  221. //使输出符合測试系统要求的格式
  222. if(i == n-1)
  223. printf("%d\n",LevTraverse[i]);
  224. else
  225. printf("%d ",LevTraverse[i]);
  226. }
  227.  
  228. free(LevTraverse);
  229. LevTraverse = NULL;
  230.  
  231. free(pTree);
  232. pTree = NULL;
  233. }
  234. return 0;
  235. }

/**************************************************************
    Problem: 1523
    User: mmc_maodun
    Language: C
    Result: Accepted
    Time:0 ms
    Memory:916 kb
****************************************************************/

【剑指offer】从上向下打印二叉树的更多相关文章

  1. 剑指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 ...

  2. 剑指offer——从上往下打印二叉树

    题目描述:从上到下打印二叉树的节点,同一层的从左到右打印 思路:采用队列来存储单层的节点,然后通过删除队列的头结点操作,依次遍历每一层. 代码为: import java.util.ArrayList ...

  3. 剑指Offer 从上往下打印二叉树(dfs)

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印.   思路: 用一个队列来辅助,先压入根节点,设置一个指针记录队列头位置,判断队头指针有没有孩子,有压入左右孩子,,,操作完一次,队头出 ...

  4. 用js刷剑指offer(从上到下打印二叉树)

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 牛客网链接 js代码 /* function TreeNode(x) { this.val = x; this.left = null ...

  5. 剑指Offer-22.从上往下打印二叉树(C++/Java)

    题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 分析: 按层次打印二叉树的节点,重点就是我们在打印一层节点的时候,同时按顺序保存好当前节点的下一层节点,也就是左节点和右节点,当此层节点 ...

  6. 剑指offer--29.从上往下打印二叉树

    层序遍历,队列 ------------------------------------------------------------------------------------- 时间限制:1 ...

  7. 剑指offer23 从上往下打印二叉树

    没有把队列的头部弹出,出现内存错误:

  8. Go语言实现:【剑指offer】按之字形打印二叉树

    该题目来源于牛客网<剑指offer>专题. 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. ...

  9. 剑指offer:按之字形打印二叉树(栈|双向队列+中序遍历)

    1. 题目描述 /** 请实现一个函数按照之字形打印二叉树, 即第一行按照从左到右的顺序打印, 第二层按照从右至左的顺序打印, 第三行按照从左到右的顺序打印, 其他行以此类推. */ 2. 双向队列 ...

  10. 剑指Offer——按之字形顺序打印二叉树

    题目描述: 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 分析: 我们都知道二叉树的层次遍历用的是队 ...

随机推荐

  1. struts ModelDriven

    在表单提交的时候传值是这样,name=admin.username name=admin.password,然后在action中定义属性admin生成get和set 也可以实现ModelDriven这 ...

  2. 初遇Git与MarkDown 文件

    新年好! 昨晚熬夜在学Git,稍微会了一些命令. 推荐大家去try.github.io上学习,这是GitHub提供的网页,它在网页提供了一个“伪”模拟器,根据网页的提示学习命令.网页上说15分钟就能学 ...

  3. Jenkins Maven打包出错异常的解决方法

    Jenkins是一个很好用的打包部署工具,实现一键式部署项目,在项目处于测试阶段或者对于运维人员来讲是非常方便的一个工具. 但是最近使用Jenkins部署项目时老是出错,主要是maven打包的问题,错 ...

  4. source code of MES Data

    <HTML> <HEAD> <TITLE>TELOGS</TITLE> </HEAD> <BODY> <?php /* c ...

  5. 在Update Panel 控件里面添加 File Upload 控件 上传文件

    Detail Information:http://www.codeproject.com/Articles/482800/FileplusUploadplusinplusUpdateplusPane ...

  6. python求微分方程组的数值解曲线01

    本人最近在写一篇关于神经网络同步的文章,其一部分模型为: x_i^{\Delta}(t)= -a_i*x_i(t)+ b_i* f(x_i(t))+ \sum\limits_{j \in\{i-1, ...

  7. set--常见成员函数及基本用法

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器. set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. ...

  8. Android studio多个项目之间怎么实现快速切换?

    Android studio多个项目之间怎么实现快速切换?Android studio中打开的项目太多了,想切换到一个项目很麻烦,怎么才能快速切换到另一个项目中呢?请看下文详细介绍 在对Android ...

  9. NodeJS用Express建立project

    1.通过下面命令建立站点基本结构: <span style="margin: 0px; padding: 0px; font-family: Verdana, Arial, Helve ...

  10. GUI动态创建button

    #include "cocos2d.h" #include "cocos-ext.h" USING_NS_CC; USING_NS_CC_EXT; using ...