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

时间:2016-04-15 14:19:25

标签: data-structures binary-tree

我想计算我已经制作了getDiameter()函数的二叉树的直径。现在在这个函数中我需要调用二叉树的findHeight()函数,它返回二叉树的高度。在code1和code2中计算高度的2个函数在概念上几乎没有什么不同。 在code1中我正在考虑具有单个节点(仅root)的树的高度为1,而在code2中我正在考虑单个节点的树的高度为0.因此在code1的基本情况下,我返回0并且在code2中我已经返回-1了。我很困惑哪个代码使用code1或code2是正确的,因为直径的答案会有所不同....

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 个答案:

答案 0 :(得分:0)

  

代码1和代码2中的两个概念都是正确的,可以找到二叉树的高度。

关键是你必须与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));

}

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

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));

} 

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