题目
类型:二叉树、DFS
解题思路
二叉树的直径,就是左右子树的最大深度之和,那么直接的想法是对每个节点计算左右子树的最大高度,得出每个节点的直径,从而得出最大的那个直径。
但是由于 maxDepth 也是递归函数,所以上述方式时间复杂度较高。
需要灵活运用二叉树的后序遍历,在 maxDepth 的后序遍历位置顺便计算最大直径。
代码
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/class Solution {int maxDiameter = 0;public int diameterOfBinaryTree(TreeNode root) {maxDepth(root);return maxDiameter;}int maxDepth(TreeNode root) {if (root == null) {return 0;}int leftMax = maxDepth(root.left);int rightMax = maxDepth(root.right);// 后序遍历位置顺便计算最大直径maxDiameter = Math.max(maxDiameter, leftMax + rightMax);return 1 + Math.max(leftMax, rightMax);}}
