今天在牛客网上做了一题,是关于完全二叉树在某一层的节点的个数问题,题目不难,但是由于水平太渣,调试了好久才ac.
题目是这样的。
有一棵树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY。该树是完全二叉树。
输入描述:
输入有多组数据。 每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入,再输入一个d代表深度。
输出描述:
输出该树中第d层得所有节点,节点间用空格隔开,最后一个节点后没有空格。
输入例子:
4 1 2 3 4 2
输出例子:
2 3
代码如下:
import java.util.Scanner;
import java.util.LinkedList;
import java.util.ArrayList;
class TreeNode
{
int data;
int level;
TreeNode left;
TreeNode right;
TreeNode(int data)
{
this.data = data;
}
}
public class Main
{
static ArrayList<Integer> list1 = new ArrayList<Integer>();
public static void main(String args[])
{
Scanner sc =new Scanner(System.in);
LinkedList<TreeNode> list = new LinkedList<TreeNode>();
while(sc.hasNext())
{
int n = sc.nextInt();
int a[] = new int[n];
for(int i=0;i<n;i++)
{
a[i] = sc.nextInt();
}
TreeNode root = new TreeNode(a[0]);
root.level = 1;
list.add(root);
for(int i=1;i<n;i++)
{
insert(root,list,a[i]);
}
list.clear();//要及时清除内容,否则后面有continue就结束循环了。
int l = sc.nextInt();
preorder(root,l);
if(list1.size()==0)
{
System.out.println("EMPTY");
continue;
}
else
{
for(int i=0;i<list1.size()-1;i++)
{
System.out.print(list1.get(i)+" ");
}
System.out.println(list1.get(list1.size()-1));
}
list1.clear();
}
}
public static void insert(TreeNode root,LinkedList<TreeNode> list,int data)
{
TreeNode tmp ;
int max = 0;
if(!list.isEmpty())
{
tmp = list.removeFirst();
if(tmp.left==null)
{
tmp.left = new TreeNode(data);
tmp.left.level = tmp.level+1;
max = tmp.level+1;
list.addLast(tmp.left);
}
else if(tmp.right==null)
{
tmp.right = new TreeNode(data);
tmp.right.level = tmp.level+1;
max = tmp.level+1;
list.addLast(tmp.right);
}
if(tmp.left==null||tmp.right==null)
{
list.addFirst(tmp);
}
}
}
public static void preorder(TreeNode root,int l)
{
if(root==null)
return ;
if(root.level==l)
list1.add(root.data);
preorder(root.left,l);
preorder(root.right,l);
}
}
开始写的时候没有注意,把list的清空放在了最后,但是由于前面空的话会提前结束循环,所以造成list的内容不能释放。造成错误,把list的清除放在前面就可以了。这告诉我们不用的东西要及时清理。
因为是完全二叉树,所以代码还可以这么写:
#include <stdio.h>
#include <math.h>
int main(){
int n;
while(~scanf("%d",&n)){
int t[1001]={0},d;
for(int i = 1; i <= n; i++)
scanf("%d",t+i);
scanf("%d",&d);
int l = pow(2,d-1);
int r = 2*l;
if(l>n){
printf("EMPTY\n");
continue;
}
if(r>n)
r = n+1;
for(int i = l; i < r; i++){
printf("%d", t[i]);
if(i!=r-1)
printf(" ");
}
printf("\n");
}
}
这一题给了我挺多启发,写博客记录一下。