题目:
求出一个二叉树的最大直径
直径定义:二叉树中任意两个节点之间的距离,也就是两点之间共有多少条边连通。
思路:
因为每一个节点都只有左子树和右子树两条路径可以走,每走一个点,路径值也就加一。
所以该题目可以转化为求当前节点的左子树节点和右子树节点之和的最大值。
可以通过深度优先遍历每次遍历一个节点,就求出当前情况下的最大值,将整个二叉树的节点遍历完,最大值也就求出来了。
该题和LeetCode 124.二叉树中的最大路径和很相似,都利用了分治思想,先递归求子问题的解,再根据子问题的解求出更大的问题的解。
以下为代码+注释:
//定义TreeNode节点
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int val){
this.val = val;
}
}
// 设置一个全局变量表示结果maxRes
int maxRes = 0;
public int diameterOfBinaryTree(TreeNode root) {
dfs(root);
return maxRes;
}
public int dfs(TreeNode root){
if(root == null)
return 0;
// 计算当前节点左子树的节点个数
int l = dfs(root.left);
// 计算当前节点右子树的节点个数
int r = dfs(root.right);
// 每走过一个节点就更新一次结果
maxRes = Math.max(maxRes, l + r);
// 返回当前节点下走过的最多节点个数(附带根节点)
return Math.max(l, r) + 1;
}
笔者也在不断学习中,如有错误,欢迎指正!