[华为OD] B卷 树状结构查询 200

题目:

通常使用多行的节点、父节点表示一棵树,比如

西安 陕西

陕西 中国

江西 中国

中国 亚洲

泰国 亚洲

输入一个节点之后,请打印出来树中他的所有下层节点

输入描述

第一行输入行数,下面是多行数据,每行以空格区分节点和父节点

接着是查询节点

输出描述

输出查询节点的所有下层节点。以字典序排序Q

备注

树中的节点是唯一的,不会出现两个节点,是同一个名字

示例1:

输入

5

b a

c a

d c

e c

f d

c

输出

d

e

f

题解:

题目不难,就是构建一个树状的数据结构,只是遍历打印的时候需要注意下,如果子节点有多重树的话,先打印子节点,再打印子节点的子节点。

代码:

java 复制代码
import java.util.*;

public class TreeInfo {
    public static void main(String[] args) {

        Map<String, Tree> treeMap = new HashMap<>();
        Scanner sc = new Scanner(System.in);

        int lines = Integer.valueOf(sc.nextLine());
        for (int i = 0; i < lines; i++) {
            String[] treesInfo = sc.nextLine().split(" ");
            Tree tree = new Tree(treesInfo[1]);
            String child = treesInfo[0];
            if (treeMap.containsKey(tree.getParent())) {
                tree = treeMap.get(treesInfo[1]);
                tree.allChildRen(child);
            } else {
                tree.allChildRen(child);
            }
            treeMap.put(treesInfo[1], tree);
        }

        String treeNode = sc.nextLine();
        List<String> nextNodes = new ArrayList<>();

        printChild(treeNode, treeMap, nextNodes);
    }

    private static void printChild(String node, Map<String, Tree> treeMap, List<String> nextNodes) {
        List<String> children = treeMap.get(node).getChildren();
        for (String child : children) {
            System.out.println(child);
            if (treeMap.containsKey(child)) {
                nextNodes.add(child);
            }
        }
        if (nextNodes.size() > 0) {
            String newNode = nextNodes.get(0);
            nextNodes.remove(0);
            printChild(newNode, treeMap, nextNodes);
        }
    }

    private static class Tree {
        String parent;
        List<String> children;

        public Tree(String parent) {
            this.parent = parent;
            children = new ArrayList<>();
        }

        public String getParent() {
            return parent;
        }

        public void setParent(String parent) {
            this.parent = parent;
        }

        public List<String> getChildren() {
            return children;
        }

        public void setChildren(List<String> children) {
            this.children = children;
        }

        private void allChildRen(String child) {
            if (this.children != null && this.children.contains(child)) {
                return;
            } else {
                this.children.add(child);
            }
        }
    }
}

验证:

相关推荐
FMRbpm2 分钟前
树的练习7--------LCR 052.递增顺序搜索树
数据结构·c++·算法·leetcode·深度优先·新手入门
m0_748252388 分钟前
Java 变量类型
java·数据结构·windows
Yupureki44 分钟前
《算法竞赛从入门到国奖》算法基础:入门篇-递归初阶
c语言·开发语言·数据结构·c++·算法·visual studio
漫随流水1 小时前
leetcode回溯算法(17.电话号码的字母组合)
数据结构·算法·leetcode·回溯算法
小李独爱秋1 小时前
计算机网络经典问题透视:漏桶管制器的工作原理是怎么样的?
数据结构·计算机网络·算法·信息与通信·流量控制·漏桶管制器
2401_841495641 小时前
【数据结构】英文单词词频统计与检索系统
数据结构·c++·算法·排序·词频统计·查找·单词检索
one____dream2 小时前
【算法】合并两个有序链表
数据结构·python·算法·链表
好奇龙猫2 小时前
【大学院-筆記試験練習:线性代数和数据结构(13)】
数据结构·线性代数
wen__xvn2 小时前
基础数据结构第10天:队列(实战篇)
数据结构·c++·算法
橘颂TA2 小时前
【剑斩OFFER】算法的暴力美学——力扣 433 题:最小基因变化
数据结构·c++·算法·哈希算法