华为3.30 第三题 考后写的,还没在网页测过

import java.util.*;

public class Main {
    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        public TreeNode(int val) {
            this.val = val;
        }
    }

    Map<String, Integer> map = new HashMap<>();
    static List<TreeNode> res = new ArrayList<>();

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        String[] values = s.substring(1, s.length() - 1).split(",");
        Main main = new Main();
        TreeNode root = main.buildTree(0, values);
        main.dfs(root);
        int index = 0;
        int maxDepth = 0;
        for (int i = 0; i < res.size(); i++) {
            int depth = main.maxDepth(res.get(i));//子树最大深度
            if (depth > maxDepth) {
                index = i;
                maxDepth = depth;
            }
        }
        //不包含只有一个节点的子树
        if (maxDepth == 1) {
            System.out.println("-1");
            return;
        }
        //获取深度最长的子树
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        TreeNode node = res.get(index);
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(node);
        int depth = 1;
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode poll = queue.poll();
                if (poll == null) {
                    sb.append("null").append(",");
                } else {
                    sb.append(poll.val).append(",");
                    if (depth < maxDepth) {
                        queue.add(poll.left);
                        queue.add(poll.right);
                    }
                }
            }
            depth++;
        }
        sb.setLength(sb.length() - 1);
        sb.append("]");
        System.out.println(sb);
    }

    public TreeNode buildTree(int index, String[] values) {
        if (index >= values.length) {
            return null;
        }
        String value = values[index];
        if (value.equals("null")) {
            return null;
        }
        TreeNode root = new TreeNode(Integer.parseInt(value));
        root.left = buildTree(2 * index + 1, values);
        root.right = buildTree(2 * index + 2, values);
        return root;
    }

    public String dfs(TreeNode root) {
        if (root == null) {
            return "#";
        }
        String left = dfs(root.left);
        String right = dfs(root.right);
        String tree = root.val + "," + left + "," + right;
        int count = map.getOrDefault(tree, 1);
        if (count == 2) {
            res.add(root);
        }
        map.put(tree, count + 1);
        return tree;
    }

    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        return Math.max(left, right) + 1;
    }
}

#华为机试##实习##华为##笔经#
全部评论
请问题目是什么?搜了好久也没找到题目。
点赞 回复 分享
发布于 2022-04-03 23:36
第一题答案有吗?
点赞 回复 分享
发布于 2022-04-11 21:10

相关推荐

10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
我即大橘:耐泡王
点赞 评论 收藏
分享
评论
点赞
4
分享
牛客网
牛客企业服务