解法一:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class MyInt{//自定义一个类,为了在传给方法int类型时可以修改其值
int val;
}
public class Solution {
//对于树的每一条串联起来的路径,都是从一个叶子结点指向另一个叶子结点,
//而且最长的那条路径不一定经过根节点
//正是因为那条最长的路径不一定经过根节点,所以需要遍历所有的结点,对于每一个结点,经过它的最长的路径的,其实就是它的左子树的深度加上,它的右子树的深度,再加1
//所以弄清楚问题的实质:实际是一个遍历二叉树与求深度结合起来的问题,但是这种方法只能求出具体的长度,无法求出具体有哪些路径
private int depth(TreeNode root){//求二叉树的深度
if(root == null) return 0;
return 1 + Math.max(depth(root.left), depth(root.right));
}
private void recurse(TreeNode root, MyInt max){//遍历二叉树
if(root == null) return;
int curDiameter = 1 + depth(root.left) + depth(root.right) - 1;//求出经过当前结点的路径的最大长度,减1是根据题目的要求调整的
//System.out.println("node.val:" + root.val + " depth_left:" + depth(root.left) + " depth_left:" + depth(root.right));
max.val = Math.max(max.val, curDiameter);
recurse(root.left, max);
recurse(root.right, max);
}
public int diameterOfBinaryTree(TreeNode root) {
MyInt max = new MyInt();
max.val = 0;
recurse(root, max);
return max.val;
}
}
本文介绍了一种求解二叉树直径的有效算法。通过遍历每个节点并计算左右子树深度来找出最长路径,利用自定义类解决整型变量不可修改的问题。此方法虽不能给出具体路径,但能高效求得路径长度。
441

被折叠的 条评论
为什么被折叠?



