二叉树相关算法设计题

一.

题目:

二叉树按层打印,同时输出格式满足:打印完一层要换行,每一行的行首标明:level  i(i=1,2,3...层)

思路:1.先把二叉树的层次遍历搞懂:

        用队列实现,原理是:根节点入队,然后在队列不空的时候循环,循环体操作为:抛出队首元素并向队尾添加该抛出节点的左右子节点(如果不为空的话)

   2.题目有两个额外的要求。a.换行打印。b.打印行号。其实就是让我们在层次遍历时遇到每一层的最右节点出队打印时换行并打印行号,

      其实a和b是一样的,只要知道怎么换行,在换行时加上level++的打印字段既可以了。

     3.注意到:上一层的最右节点的打印导致:a.上一层打印结束,该换行了;b.此时队尾必定是下一层的最右一个元素,因为出队打印必天剑左右子节点,如果有的话。这个信息就是解题的关键所在。

     4.代码如下:关键在于:用cur与last两个标记,分别标记了:上一层的最右一个节点与一直往队尾添加的节点。如此,在每打印一次并且已经做了添加左右子节点的工作后,加上判断是否temp==cur,就轻松掌握了每一层结束的时机了。

 1 private static void showByLevel(node head) {
 2         if (head == null)
 3             return;
 4         Queue<node> queue = new LinkedList<>();// 可以用作队列
 5         queue.offer(head);
 6         node cur = head;// 标记上一层的最右一个节点
 7         node last = null;// 标记一直往队尾添加的节点
 8         int level = 1;
 9         System.out.print("level" + (level++) + ":");
10         while (!queue.isEmpty()) {
11             node temp = queue.poll();
12             System.out.print(temp.val + "  ");
13
14             if (temp.left != null) {
15                 queue.offer(temp.left);
16                 last = temp.left;// offer方法如果容量不足则抛出异常让你处理;add方法则是返回false
17             }
18             if (temp.right != null) {
19                 queue.offer(temp.right);
20                 last = temp.right;
21             }
22             if (temp == cur && !queue.isEmpty()) {
23                 System.out.println("\nlevel" + (level++) + ":");
24                 cur = last;
25             }
26         }
27     }

原文地址:https://www.cnblogs.com/zclun/p/10651650.html

时间: 2024-11-06 03:44:04

二叉树相关算法设计题的相关文章

两道考研算法设计题- 2010 2013

2010: 设将n(n>1)个整数存放到一维数组R中.试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移P(0<P<n)个位置,即将R中的数据由(x0,x1,…,xn-1)变换为(xp,xp+1,…,xn-1,x0,x1,…,xp-1).要求: (1)给出算法的基本设计思想. (2)根据设计思想,采用C或C++或JAVA语言描述算法,关键之处给出注释. (3)说明设计算法的时间复杂度和空间复杂度. [解析]: (1)前P个数依次进队,while(i<n-p) 

树和二叉树相关算法(一) c/c++

1 //双亲储存结构 2 typedef struct{ 3 ElemType data; 4 int parent; 5 }PTree[MaxSize]; 6 7 //孩子链储存结构 8 const int MaxSons = 10; 9 typedef struct node{ 10 ElemType data; 11 struct node* sons[MaxSons]; 12 }TSonNode; 13 14 //孩子兄弟链储存结构 15 typedef struct tnode{ 16

第三章算法设计题

3.2.8 /***循环队列基本操作***/ #include<cstdlib> #include<iostream> #include<fstream> using namespace std; #define MAXQSIZE 100 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int QElemType; typedef int Status; typedef struct { QElemTyp

python 实现二叉树相关算法

一.构建与遍历二叉树 class Node(object): def __init__(self,item): self.key=item self.left=None self.right=None class BinaryTree(object): def __init__(self): self.root=None def addNode(self,item): new_node = Node(item) if self.root is None: self.root=new_node e

从数组循环左移问题中浅谈考研算法设计的规范代码

问题:设将n(n>1)个整数存放到一维数组R中.设计一个算法,将R中的序列循环左移p(0<p<n)个位置,即将R中的数据由{X0,X1,...,Xn-1}变换为{Xp,Xp+1,...,Xn-1,X0,X1,...,Xp-1}.要求:写出本题的算法描述. 分析: 本题不难,要实现R中序列循环左移p个位置,只需先将R中前p个元素逆置,再将剩下的元素逆置,最后整体逆置操作即可.本题算法描述如下: 1 #include <iostream> 2 using namespace st

二分查找的相关算法题

最近笔试经常遇到二分查找的相关算法题 1)旋转数组中的最小数字 2)在旋转数组中查找某个数 2)排序数组中某个数的出现次数 下面我来一一总结 1 旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 实现数组的旋转见左旋转字符串. 和二分查找法一样,用两个指针分别指向数组的第一个元素和最后一个元素. 我们注意到旋转

《计算机算法设计与分析》v4 第1章 算法概述 算法实现题答案

博主今年刚上大三,正好开算法这门课.由于博主本人比较喜欢算法但又比较懒,啃不动算法导论,所以决定拿这本书下手. 这本书是王晓东的第四版<计算机算法设计与分析>.初步打算将每章后面的算法题都用代码实现. 有些题跟某个ACM题目很像,我会把该ACM题的链接贴上.有的题没OJ交所以可能是错的.如有发现,还望指出. 1-1 统计数字问题 http://poj.org/problem?id=2282 这个题要按位分解,一位一位的来处理. #include<iostream> #include

AACOS:基于编译器和操作系统内核的算法设计与实现

AACOS:基于编译器和操作系统内核的算法设计与实现 [计算机科学技术] 谢晓啸 湖北省沙市中学 [关键词]: 编译原理,操作系统内核实现,算法与数据结构,算法优化 0.索引 1.引论 1.1研究内容 1.2研究目的 1.3研究提要 正文 2.1研究方法 2.2编译器部分 2.2.1从计算器程序中得到的编译器制作启示 2.2.2在编译器中其它具体代码的实现 2.2.3编译器中栈的高级应用 2.2.3编译器中树的高级应用 2.2.4编译器与有限状态机 2.3操作系统内核部分 2.3.1操作系统与底

二叉树的算法与讲法

二叉树属于数据结构中层次性的数据关系,他又祖先--后代,上级--下属,整体--部分以及其他类似的关系,树结构在计算机领域中有着广泛的应用,例如在编译程序中庸语法树来表示元程序的语言结构,在数据挖掘中庸决策树来进行数据分类等等.在我的前一个博客中也有提到就是二叉树的相关知识重点.不清楚的同行可以参考我的文章.其中若有不妥之处,还请大家指点. 下面是我在学习二叉树的时候编写的二叉树的几个常见的功能的函数,以及他的一些构造函数等等. #ifndef BITREE_H #define BITREE_H