Data structures 使用树的高度递归二叉树的直径?

Data structures 使用树的高度递归二叉树的直径?,data-structures,binary-tree,Data Structures,Binary Tree,我想计算一棵二叉树的直径,我为它创建了一个getDiameter函数。现在在这个函数中,我需要调用二叉树的findHeight函数,它返回二叉树的高度。code1和code2中计算高度的两个函数在概念上差别不大。 在代码1中,我考虑单节点树的高度。在代码2中,我考虑单节点树的高度为0。因此,在code1的基本情况下,我返回了0,在code2中,我返回了-1。我不知道哪个代码是正确的使用代码1或代码2,因为直径的答案会有所不同 public static int getDiameter(Binar

我想计算一棵二叉树的直径,我为它创建了一个getDiameter函数。现在在这个函数中,我需要调用二叉树的findHeight函数,它返回二叉树的高度。code1和code2中计算高度的两个函数在概念上差别不大。 在代码1中,我考虑单节点树的高度。在代码2中,我考虑单节点树的高度为0。因此,在code1的基本情况下,我返回了0,在code2中,我返回了-1。我不知道哪个代码是正确的使用代码1或代码2,因为直径的答案会有所不同

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

    int rootDiameter = findHeight(root.getLeft()) + findHeight(root.getRight()) + 1;
    int leftDiameter = getDiameter(root.getLeft());
    int rightDiameter = getDiameter(root.getRight());

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


code1

public static int findHeight(BinaryTreeNode node) {
    if(node == null)
        return 0;
    else {
        return 1+Math.max(findHeight(node.left), findHeight(node.right));
    }

}
Code 2

public static int findHeight(BinaryTreeNode node) {
    if(node == null)
        return -1;
    else {
        return 1+Math.max(findHeight(node.left), findHeight(node.right));
    }

}
代码1和代码2中的概念都可以正确地计算二叉树的高度

关键是,对于这两种不同的代码,您必须与getDiameter函数保持一致

因此,如果使用代码1,则getDiameter函数将为:

public static int getDiameter(BinaryTreeNode root) {        

if (root == null)
    return 0;

int rootDiameter = findHeight(root.getLeft()) + findHeight(root.getRight()) + 1;
int leftDiameter = getDiameter(root.getLeft());
int rightDiameter = getDiameter(root.getRight());

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

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

int rootDiameter = findHeight(root.getLeft()) + findHeight(root.getRight()) + 3;
int leftDiameter = getDiameter(root.getLeft());
int rightDiameter = getDiameter(root.getRight());

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

} 
如果使用代码2,则getDiameter函数将为:

public static int getDiameter(BinaryTreeNode root) {        

if (root == null)
    return 0;

int rootDiameter = findHeight(root.getLeft()) + findHeight(root.getRight()) + 1;
int leftDiameter = getDiameter(root.getLeft());
int rightDiameter = getDiameter(root.getRight());

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

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

int rootDiameter = findHeight(root.getLeft()) + findHeight(root.getRight()) + 3;
int leftDiameter = getDiameter(root.getLeft());
int rightDiameter = getDiameter(root.getRight());

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

} 
现在,两种情况下直径的答案都是正确的