java - 二叉树的直径 - 更好的设计

标签 java algorithm recursion tree binary-tree

我写了一个代码来计算二叉树的直径。 需要以下方面的建议:

  1. 我可以不在类级别使用静态变量来做到这一点吗?
  2. 算法好吗/有什么建议吗?

    public class DiameterOfTree {   
    public static int diameter = 0; 
    public static int getDiameter(BinaryTreeNode root) {        
        if (root != null) {                     
            int leftCount = getDiameter(root.getLeft());
            int rightCount = getDiameter(root.getRight());
            if (leftCount + rightCount > diameter) {
                diameter = leftCount + rightCount;
                System.out.println("---diameter------------->" + diameter);
            }           
            if ( leftCount > rightCount) {
                return leftCount + 1;
            }
            return rightCount + 1;
        }
        return 0;
      }
    }
    

最佳答案

在尝试找到二叉树中两个节点之间的最长路径(直径)时,需要考虑三种情况:

  1. 最长的路径通过根,
  2. 最长的路径完全包含在左子树中,
  3. 最长的路径完全包含在右子树中。

通过根的最长路径只是左右子树高度的总和(+1 根不需要,因为树的直径有一个根节点和 1 个左子树,1 个右子树节点将是2),另外两个可以递归找到:

public static int getDiameter(BinaryTreeNode root) {        
    if (root == null)
        return 0;

    int rootDiameter = getHeight(root.getLeft()) + getHeight(root.getRight()); //Removing the +1
    int leftDiameter = getDiameter(root.getLeft());
    int rightDiameter = getDiameter(root.getRight());

    return Math.max(rootDiameter, Math.max(leftDiameter, rightDiameter));
}

public static int getHeight(BinaryTreeNode root) {
    if (root == null)
        return 0;

    return Math.max(getHeight(root.getLeft()), getHeight(root.getRight())) + 1;
}

关于java - 二叉树的直径 - 更好的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11897088/

相关文章:

java - 如何将utf-8格式的字符串(不是bytes[])解码为java中的另一个字符串?

c++ - 最短成本路径

algorithm - 给定一台重量最大的电梯和重量为 x_i 的 n 个人,找出所需的最少乘车次数

algorithm - 优化递归序列的计算

java - Richfaces 弹出面板

JavaFX 导出和 VM 参数

java - 斯卡拉 : class[T] extends T?

algorithm - 压缩字母数字字符串

c - 如何递归访问结构体的某些元素

c - 如何获得使用递归的警告?