03-树2 List Leaves
这是我第一次做PTA不用借鉴网络上的代码并且AC的题目!!
Given a tree, you are supposed to list all the leaves in the order of top down, and left to right.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤10) which is the total number of nodes in the tree – and hence the nodes are numbered from 0 to N−1. Then N lines follow, each corresponds to a node, and gives the indices of the left and right children of the node. If the child does not exist, a “-” will be put at the position. Any pair of children are separated by a space.
Output Specification:
For each test case, print in one line all the leaves’ indices in the order of top down, and left to right. There must be exactly one space between any adjacent numbers, and no extra space at the end of the line.
Sample Input:
8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6
Sample Output:
4 1 5
思路
1.首先还是用静态链表存储二叉树
struct TreeNode{
int data;
int left,right;
};
TreeNode T[MaxTree];
并用全局数组T[]用来存储
2.由于题目要求由上到下由左到右输出–联想到层次遍历
3.整体框架先建立起来:
int main(){
int root=BuildTree(T);
FloorPrint(root);
return 0;
}
代码
#include<iostream>
#include<queue>
#define MaxTree 10
#define null -1
using namespace std;
struct TreeNode{
int data;
int left,right;
};
TreeNode T[MaxTree];
int BuildTree(TreeNode T[]){//建立二叉树
int N;
scanf("%d",&N);
int check[N],root=-1;
for(int i=0;i<N;i++)
check[i]=0;
for(int i=0;i<N;i++){
T[i].data=i;//data记录结点号
char lc,rc;
scanf("\n%c %c",&lc,&rc);
if(lc!='-'){
T[i].left=lc-'0';
check[T[i].left]=1;
}else{
T[i].left=null;
}
if(rc!='-'){
T[i].right=rc-'0';
check[T[i].right]=1;
}else{
T[i].right=null;
}
}
for(int i=0;i<N;i++){
if(check[i]==0){
root=i;
break;
}
}
return root;
}
void FloorPrint(int root){//层次遍历输出
queue<TreeNode> q;
if(root!=-1){//树不为空
q.push(T[root]);
}
int flag=0;//判断是否第一个输出
while(q.empty()==false){
TreeNode temp=q.front();
if(temp.left==null&&temp.right==null){//是叶子结点
if(flag){
printf(" ");
}
flag=1;
printf("%d",temp.data);
}
if(temp.left!=null){//左结点不空
TreeNode templeft=T[temp.left];
q.push(templeft);
}
if(temp.right!=null){//左结点不空
TreeNode tempright=T[temp.right];
q.push(tempright);
}
q.pop();
}
}
int main(){
int root=BuildTree(T);
FloorPrint(root);
return 0;
}
相关知识的回顾
层次遍历
void FloorPrint_QUEUE(pTreeNode &Tree) //层序遍历_队列实现
{
queue < pTreeNode> q;
if (Tree != NULL)
{
q.push(Tree); //根节点进队列
}
while (q.empty() == false) //队列不为空判断
{
cout << q.front()->data << " → ";
if (q.front()->leftPtr != NULL) //如果有左孩子,leftChild入队列
{
q.push(q.front()->leftPtr);
}
if (q.front()->rightPtr != NULL) //如果有右孩子,rightChild入队列
{
q.push(q.front()->rightPtr);
}
q.pop(); //已经遍历过的节点出队列
}
}
队列
queue 和 stack 有一些成员函数相似,但在一些情况下,工作方式有些不同:
- front():返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue
为空,返回值是未定义的。 - back():返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue
为空,返回值是未定义的。 - push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back()
来完成的。 - push(T&& obj):以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数
push_back() 来完成的。 - pop():删除 queue 中的第一个元素。
- size():返回 queue 中元素的个数。
- empty():如果 queue 中没有元素的话,返回 true。
- emplace():用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。
- swap(queue &other_q):将当前 queue 中的元素和参数 queue
中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。
注意:queue没有.top()
函数只有.front()
函数,不要和stack搞混!