📅  最后修改于: 2023-12-03 15:36:03.528000             🧑  作者: Mango
二叉树的直径是指数中最长两个节点之间的距离。这个距离可以通过两个节点的深度之和来计算,因此二叉树的直径问题可以转换成求二叉树中每个节点的左子树和右子树的深度之和。
我们可以使用递归的方式来计算二叉树中每个节点的深度。对于每个节点,递归调用求解左右子树节点的深度,然后将其加起来即可得到当前节点的深度。
private int getDepth(TreeNode node) {
if (node == null) {
return 0;
}
return Math.max(getDepth(node.left), getDepth(node.right)) + 1;
}
计算直径时,我们可以使用和上面类似的递归方式,对于每个节点,递归调用求解左右子树节点的深度之和,取最大值作为直径。当然,如果当前节点没有左右子树,则直径为0。
private int getDiameter(TreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = getDepth(root.left);
int rightDepth = getDepth(root.right);
int maxDiameter = leftDepth + rightDepth;
return Math.max(maxDiameter, Math.max(getDiameter(root.left), getDiameter(root.right)));
}
通过递归的方式,我们可以比较轻松地解决二叉树的直径问题。我们只需要在递归过程中求解每个节点的深度或深度之和即可。这种方法的时间复杂度为O(n^2),其中n是节点数。当然,在实际应用中,我们能否使用更快的算法来降低时间复杂度仍是需要考虑的问题。