当前位置:   article > 正文

牛客网刷题-树的直径_给定一棵多叉树,求出这棵树的直径,即树上最远两点的距离。

给定一棵多叉树,求出这棵树的直径,即树上最远两点的距离。

问题描述

给定一棵树,求出这棵树的直径,即树上最远两点的距离。

输入描述:
输入节点个数,每条边的两个节点,边的权重

输出描述:
输出最长的路径

示例

示例1

输入
6,[[0,1],[1,5],[1,2],[2,3],[2,4]],[3,4,2,1,5]

输出
11

解决思路

分析

本题主要是通过深度优先遍历,通过对比判断走每一条路径的权重值,得到最大值

方法

  1. 采用深度优先遍历的方式,遍历树,得到最大值

代码实现

public class Solution {
    /**
     * 树的直径
     *
     * @param n int整型 树的节点个数
     * @param Tree_edge Interval类一维数组 树的边
     * @param Edge_value int整型一维数组 边的权值
     * @return int整型
     */
    //6,[[0,1],[1,5],[1,2],[2,3],[2,4]],[3,4,2,1,5]
    int res = 0;

    public int solve(int n, Interval[] Tree_edge, int[] Edge_value) {
        // write code here
        // list数组存储每个节点的所有边
        List<int[]>[] map = new ArrayList[n];
        // 将所有的节点初始化
        for (int i = 0; i < n; i++) map[i] = new ArrayList();
        // 遍历所有的边,一次添加到对应数组的list中
        for (int i = 0; i < Tree_edge.length; i++) {
            // 起始节点的边,存储终节点和边的权重值
            map[Tree_edge[i].start].add(new int[]{Tree_edge[i].end, Edge_value[i]});
            // 终节点的边,存储起节点和权重值
            map[Tree_edge[i].end].add(new int[]{Tree_edge[i].start, Edge_value[i]});
        }
        // 深度优先遍历,通过数组的bool值判断节点是否已经访问过
        dfs(map, 0, new boolean[n]);
        return res;
    }

    private int dfs(List<int[]>[] map, int index, boolean[] visited) {
        // 将节点置为已经访问
        visited[index] = true;
        // 获取节点的所有的边
        List<int[]> list = map[index];
        int weight1 = 0, weight2 = 0;
        // 遍历所有的边
        for (int[] child2weight : list) {
            // 获取边的另一端
            int child = child2weight[0];
            // 获取边的权重
            int weight = child2weight[1];
            // 判断边是否已经访问
            if (visited[child]) continue;
            // 计算路径长度
            int num = weight + dfs(map, child, visited);

            if (num > weight1) {
                weight2 = weight1;
                weight1 = num;
            } else if (num > weight2) {
                weight2 = num;
            }
            if (weight1 + weight2 > res) res = weight1 + weight2;
        }
        return Math.max(weight1, weight2);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

小伙伴如果想测试的话,可以直接到牛客网这个链接做测试

树的直径-牛客网

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/226686
推荐阅读
相关标签
  

闽ICP备14008679号