博客
关于我
牛客网算法——名企高频面试题143题(3)
阅读量:797 次
发布时间:2023-03-29

本文共 3238 字,大约阅读时间需要 10 分钟。

为了解决这个问题,我们需要找到一棵树中最远两点之间的距离,即树的直径。直径定义为路径上的节点值之和的最大值。

方法思路

为了找到树的直径,我们可以采用以下步骤:

  • 计算树的高度:使用广度优先搜索(BFS)来计算树的高度,高度定义为从根节点到叶子节点的路径长度。
  • 确定中心层:找到树的高度h的最低满足2^k <= h的k值。中心层位于第k层。
  • 收集中心点:从根节点出发,进行BFS,收集第k层的所有节点作为中心点。
  • 计算最大路径和:从每个中心点出发,计算最长路径和,找到最大的那个,即为树的直径。
  • 解决代码

    import java.util.ArrayList;import java.util.List;public class BinaryTreeDiameter {    public class TreeNode {        int val;        TreeNode left;        TreeNode right;        public TreeNode(int val) {            this.val = val;        }    }    public int diameterOfBinaryTree(TreeNode root) {        if (root == null) {            return 0;        }        int height = calculateTreeHeight(root);        int k = findCenterLevel(height);        List
    centerNodes = getCenterNodes(root, k); return computeMaxPathSum(centerNodes); } private int calculateTreeHeight(TreeNode root) { if (root == null) { return 0; } int height = 0; bfs(root, 0, height); return height; } private void bfs(TreeNode node, int currentLevel, int& height) { if (node == null) { return; } if (currentLevel > height) { height = currentLevel; } if (node.left != null) { bfs(node.left, currentLevel + 1, height); } if (node.right != null) { bfs(node.right, currentLevel + 1, height); } } private int findCenterLevel(int h) { int k = 0; while (Math.pow(2, k) <= h) { k++; } k--; // 最大的k满足2^k <= h return k; } private List
    getCenterNodes(TreeNode root, int k) { List
    centerNodes = new ArrayList<>(); bfs(root, 0, 0, centerNodes, k); return centerNodes; } private void bfs(TreeNode node, int currentLevel, int targetLevel, List
    centerNodes, int k) { if (node == null) { return; } if (currentLevel == targetLevel) { centerNodes.add(node); return; } if (currentLevel < targetLevel) { if (node.left != null) { bfs(node.left, currentLevel + 1, targetLevel, centerNodes, k); } if (node.right != null) { bfs(node.right, currentLevel + 1, targetLevel, centerNodes, k); } } } private int computeMaxPathSum(List
    centerNodes) { int maxSum = 0; for (TreeNode centerNode : centerNodes) { int currentMax = computePathSum(centerNode); if (currentMax > maxSum) { maxSum = currentMax; } } return maxSum; } private int computePathSum(TreeNode node) { if (node == null) { return 0; } int leftSum = computePathSum(node.left); int rightSum = computePathSum(node.right); int maxChildSum = Math.max(leftSum, rightSum); return node.val + maxChildSum; }}

    代码解释

  • TreeNode类:表示二叉树的节点,包含值、左子树和右子树。
  • calculateTreeHeight:使用BFS计算树的高度。
  • findCenterLevel:确定中心层的k值,使得2^k是树高度的最低幂次。
  • getCenterNodes:收集第k层的所有节点作为中心点。
  • computeMaxPathSum:从每个中心点出发,计算最长路径和,返回最大值。
  • computePathSum:从给定节点出发,计算路径上的节点值之和。
  • 通过以上步骤,我们可以高效地找到树的直径,即路径上的节点值之和的最大值。

    转载地址:http://qlhfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现使用管道重定向进程输入输出(附完整源码)
    查看>>
    Objective-C实现倒计时(附完整源码)
    查看>>
    Objective-C实现借记款项功能(附完整源码)
    查看>>
    Objective-C实现关系矩阵A和B的乘积(附完整源码)
    查看>>
    Objective-C实现关系矩阵乘法(附完整源码)
    查看>>
    Objective-C实现关系矩阵乘法(附完整源码)
    查看>>
    Objective-C实现内存映射文件(附完整源码)
    查看>>
    Objective-C实现内存泄露检查(附完整源码)
    查看>>
    Objective-C实现内格尔·施雷肯伯格算法(附完整源码)
    查看>>
    Objective-C实现几何级数的总和算法 (附完整源码)
    查看>>
    Objective-C实现分块查找算法(附完整源码)
    查看>>
    Objective-C实现分块查找算法(附完整源码)
    查看>>
    Objective-C实现分水岭算法(附完整源码)
    查看>>
    Objective-C实现分解质因数(附完整源码)
    查看>>
    Objective-C实现切换数字的符号switchSign算法(附完整源码)
    查看>>
    Objective-C实现列主元高斯消去法(附完整源码)
    查看>>
    Objective-C实现创建多级目录(附完整源码)
    查看>>
    Objective-C实现删除重复的字母字符算法(附完整源码)
    查看>>
    Objective-C实现判断32位的数字是否为正数isPositive算法(附完整源码)
    查看>>
    Objective-C实现十进制转N进制算法(附完整源码)
    查看>>