本文共 3238 字,大约阅读时间需要 10 分钟。
为了解决这个问题,我们需要找到一棵树中最远两点之间的距离,即树的直径。直径定义为路径上的节点值之和的最大值。
为了找到树的直径,我们可以采用以下步骤:
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; }} 通过以上步骤,我们可以高效地找到树的直径,即路径上的节点值之和的最大值。
转载地址:http://qlhfk.baihongyu.com/