目录
前言:
在线性结构中,每个结点只有一个后继。在有些情况下,一个结点可能有多个后继。树(tree)可以描述这类非线性结构,二叉树(Binary Tree)的递归定义如下:二叉树要么为空,要么由根节点(root)、左子树(left subrree)和右子树(right subtree)组成,而左子树和右子树分别是一颗二叉树。注意,在计算机中,树一般是“倒置”的,即根在上,叶子在下。本文将介绍二叉树的创建及层序遍历。
提示:以下是本篇文章正文内容,代码注释较为详细,可供参考
一、问题描述
输入一颗二叉树,你的任务是按从上到下、从左到右的顺序输出各个结点的值。每个结点都按照从根节点到它的移动序列给出(L表示左,R表示右)。在输入中,每个结点的左括号和右括号之间没有空格,相邻结点之间用一个空格隔开。每棵树的输用一对空括号“()”结束(这对括号本身不代表一个结点),如图所示:
注意,如果从根到某个叶节点的路径上有的结点没有在输入中给出,或者给出超过一次,应当输出-1。结点个数不超过256。
样例输入:
(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
(3,L) (4,R) ()
样例输出:
5 4 8 11 13 4 7 2 1
-1
二、创建思路及遍历方法
受之前小球下落问题的启发,是否可以把树上的结点编号,然后把二叉树储存在数组中呢?很遗憾这样的方法在此是行不通的。题目中已限制结点最多有256个。如果各个结点形成一条链,最后一个结点的编号将是巨大的!
所以,需要采用动态结构,根据需要建立新的结点,然后将其组织成一颗树。首先,先读入数据,这里采用的是string函数库里的getline。getline的函数格式:getline(cin,string对象)。getline的作用是读取一整行,直到遇到换行符才停止读取,期间能读取像空格、Tab等的空白符。 之后使用迭代器逐个分析数据,遇到数字则使用readNum函数提取。当识别到 ‘ ,’ 时便开始读取其位置信息直到遇到 ‘ )’ 代表此结点读取结束,然后通过addNode函数创建该结点。这样一来,输入和建树部分便以完成。
之后根据输出需求,从上往下,从左至右,选择层序遍历。此处使用一个队列来完成这个任务,在头文件中加入queue的头文件