刷题有感——查找完全二叉树某一层的节点个数

今天在牛客网上做了一题,是关于完全二叉树在某一层的节点的个数问题,题目不难,但是由于水平太渣,调试了好久才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");
    }
}

这一题给了我挺多启发,写博客记录一下。

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/u013264213/article/details/52894148
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞