2016-04-15 8 views
-2

私はgetDiameter()関数を作成したバイナリツリーの直径を計算します。この関数では、バイナリツリーの高さを返すBinary TreeのfindHeight()関数を呼び出す必要があります。 code1とcode2の高さを計算する2つの関数は、概念の点で少し異なります。 私は単一ノード(ルートのみ)のツリーの高さが1であり、コード2では単一ノードのツリーの高さが0であると考えています。コード1の基本ケースでは、0を返していますcode2私は-1を返しました。 Iは、コード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)); 
    } 

} 

答えて

0

....直径の答えが変化することになるので、CODE1又はCODE2を使用することが正しいをコード混乱していますバイナリツリー。

ポイントは、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)); 

} 

、コード2が使用される場合getDiameter()関数は次のようになります:

ようにコード1が使用される場合、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)); 

} 

両方の直径の答え場合が正しい..... .....

関連する問題