给分管领导网站建设情况汇报怎么写,邯郸网站制作多少钱,网站开发一般多少钱,福田区罗湖区最新通告二叉树的直径
给你一棵二叉树的根节点#xff0c;返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。
示例1#xff1a; 输入#xff1a;root [1,2…二叉树的直径
给你一棵二叉树的根节点返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。
示例1 输入root [1,2,3,4,5] 输出3 解释3 取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。
解题步骤
1、定义一个递归函数用于计算以当前节点为根节点的二叉树的最大深度。2、对于每个节点计算其左子树的最大深度和右子树的最大深度并将其相加得到经过该节点的路径长度。3、更新全局变量maxDiameter记录经过每个节点的最长路径长度。4、递归遍历所有节点更新maxDiameter。5、最终maxDiameter即为二叉树的直径
Java实现
public class DiameterOfBinaryTree {static class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int val) {this.val val;}}int diameter 0;public int diameterOfBinaryTree(TreeNode root) {calculateDiameter(root);return diameter;}private int calculateDiameter(TreeNode node) {if (node null) {return 0;}// 递归计算左子树和右子树的深度int leftDepth calculateDiameter(node.left);int rightDepth calculateDiameter(node.right);// 更新直径为左右子树深度之和的最大值diameter Math.max(diameter, leftDepth rightDepth);// 返回当前节点的深度return Math.max(leftDepth, rightDepth) 1;}// 测试实例public static void main(String[] args) {// 构造二叉树: 1// / \// 2 3// / \// 4 5TreeNode root new TreeNode(1);root.left new TreeNode(2);root.right new TreeNode(3);root.left.left new TreeNode(4);root.left.right new TreeNode(5);// 创建 DiameterOfBinaryTree 实例DiameterOfBinaryTree diameterCalculator new DiameterOfBinaryTree();// 计算直径int result diameterCalculator.diameterOfBinaryTree(root);System.out.println(二叉树的直径为: result);}
}
时间空间复杂度
时间复杂度O(n)其中n是二叉树中的节点数每个节点都需要访问一次。空间复杂度O(height)其中height是二叉树的高度递归调用栈的深度。