PTA——03-树2 List Leaves(25 分)【java语言实现】

本文介绍了一个算法问题:如何按照从上到下、从左到右的顺序输出一棵树的所有叶子节点。文章首先通过输入数据构建二叉树,然后采用层次遍历的方法找到并输出所有的叶子节点。示例输入输出展示了程序的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

03-树2 List Leaves(25 分)

题目

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) 构建二叉树
2) 层次遍历,打印叶节点

代码



import java.util.*;

class ThisTreeNode{
    int val;
    int left;
    int right;
}

public class Main {
    private static int[] check = new int[10];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ThisTreeNode[] T1 = new ThisTreeNode[10];
        int N =sc.nextInt();
        Arrays.fill(check, 0);
        int root =buildTree(sc,N,T1);

        //层次遍历二叉树,存储结点

        List<Integer> res = levelTraversal(root,T1);

        for (int i=0;i<res.size();i++){
            if (i!= res.size()-1){
                System.out.print(res.get(i)+" ");
            }
            else
                System.out.print(res.get(i));
        }



    }

    /**
     * 构建二叉树
     * @param sc
     * @param N
     * @param T
     * @return
     */
    private static int buildTree(Scanner sc,int N,ThisTreeNode[] T){
        for (int i=0;i<N;i++){
            T[i] = new ThisTreeNode();  //实例化很重要,否则会报空指针异常
            T[i].val = i;
            String left = sc.next();
            String right = sc.next();
            if(left.equals("-")){
                T[i].left = -1;
            }else{
                T[i].left = Integer.parseInt(left);
                check[Integer.parseInt(left)] = 1;
            }

            if(right.equals("-")){
                T[i].right = -1;
            }else{
                T[i].right = Integer.parseInt(right);
                check[Integer.parseInt(right)] = 1;
            }
        }
        int root = -1;
        for(int i=0;i<N;i++){
            if(check[i]==0){
                root = i;
            }
        }

        return root;
    }
/**
 * 层次遍历二叉树
 */
    private static List<Integer> levelTraversal(int root,ThisTreeNode[] T1){
        Queue<Integer> queue = new ArrayDeque<>();

        List<Integer> list = new ArrayList<>();

        queue.add(root);

        while ( queue.size()!=0){

            root = queue.poll();

            if (T1[root].left ==-1 && T1[root].right ==-1 )
                list.add(root);

             if (T1[root].left!=-1){
                queue.offer(T1[root].left);
            }

             if (T1[root].right!=-1){
                queue.offer(T1[root].right);
            }
        }

        return list;
    }
}
### 二叉先序遍历主观题及练习题 #### 题目描述 以二叉链表作为二叉的存储结构,输入二叉的先序序列,要求输出以下内容: 1. 二叉的中序遍历序列。 2. 二叉的叶子结点个数。 #### 输入格式 输入为一个字符串,表示二叉的先序遍历序列。若字符为`#`,则表示该节点为空;否则,字符为相应节点的数据元素。 #### 输出格式 输出两行: 1. 第一行是二叉的中序遍历序列。 2. 第二行是二叉的叶子结点个数。 #### 示例 **输入样例:** ``` ABC##DE#G##F### ``` **输出样例:** ``` CBEDGF 4 ``` --- #### 解决方案 ##### 数据结构定义 为了实现二叉的构建与遍历,可以定义如下的二叉节点结构[^3]: ```c typedef struct BiTNode { char data; // 节点数据 struct BiTNode* lchild; // 左子指针 struct BiTNode* rchild; // 右子指针 } BiTNode, *BiTree; ``` ##### 构建二叉函数 通过递归方式构建二叉,代码如下: ```c void CreateBiTree(BiTree* T) { char ch; scanf("%c", &ch); if (ch == '#') { *T = NULL; // 空 } else { *T = (BiTNode*)malloc(sizeof(BiTNode)); // 创建新节点 (*T)->data = ch; CreateBiTree(&((*T)->lchild)); // 递归创建左子 CreateBiTree(&((*T)->rchild)); // 递归创建右子 } } ``` ##### 中序遍历函数 通过递归实现二叉的中序遍历,代码如下: ```c void InOrderTraverse(BiTree T) { if (T != NULL) { InOrderTraverse(T->lchild); // 遍历左子 printf("%c", T->data); // 访问根节点 InOrderTraverse(T->rchild); // 遍历右子 } } ``` ##### 统计叶子节点个数函数 通过递归统计二叉的叶子节点个数,代码如下: ```c int CountLeaves(BiTree T) { if (T == NULL) { return 0; // 空没有叶子节点 } else if (T->lchild == NULL && T->rchild == NULL) { return 1; // 当前节点为叶子节点 } else { return CountLeaves(T->lchild) + CountLeaves(T->rchild); // 递归统计左右子的叶子节点 } } ``` ##### 主函数 将上述函数整合到主函数中,代码如下: ```c #include <stdio.h> #include <stdlib.h> typedef struct BiTNode { char data; struct BiTNode* lchild; struct BiTNode* rchild; } BiTNode, *BiTree; void CreateBiTree(BiTree* T) { char ch; scanf("%c", &ch); if (ch == '#') { *T = NULL; } else { *T = (BiTNode*)malloc(sizeof(BiTNode)); (*T)->data = ch; CreateBiTree(&((*T)->lchild)); CreateBiTree(&((*T)->rchild)); } } void InOrderTraverse(BiTree T) { if (T != NULL) { InOrderTraverse(T->lchild); printf("%c", T->data); InOrderTraverse(T->rchild); } } int CountLeaves(BiTree T) { if (T == NULL) { return 0; } else if (T->lchild == NULL && T->rchild == NULL) { return 1; } else { return CountLeaves(T->lchild) + CountLeaves(T->rchild); } } int main() { BiTree T = NULL; CreateBiTree(&T); // 构建二叉 InOrderTraverse(T); // 输出中序遍历序列 printf("\n"); printf("%d\n", CountLeaves(T)); // 输出叶子节点个数 return 0; } ``` --- #### 测试结果 对于输入样例`ABC##DE#G##F###`,程序输出为: ``` CBEDGF 4 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值