2016-03-31 16 views
0

BST内の各ノードについて、ノードからリーフまでの最長パスの長さはどのくらいですか? (最悪の場合) 最悪の場合、ノードからリーフまでの線形パスがあると思います。ツリー内にn個のノードがある場合、実行時間はO(n * n)です。これは正しいですか?各ノードのBST内の最長パス

+0

まずの最大は、木で、唯一のパスは、どこからでもどこにもあります@abhaybhatia

リターンで述べたように、ツリーの残りの部分の高さを探します実際には「最長」のパスではなく、単に「その」パスがあります。最悪の場合、これは線形です。バランスの取れたBSTの場合はログ)n)。私はあなたが「ランニングタイム」とは何を意味するのか分からない。 –

+0

私は、ツリー内の各ノードの最長のパスを見つけるためのコード実装の実行時間を意味します。 –

答えて

0

これは、「すべてのリーフに与えられたノード」または「与えられたリーフに対してすべてのノード」と仮定すると、線形時間で実行できます。それが「すべてのノードからすべてのリーフ」の場合、それは少し難しくなります。

これを行うには:「ターゲット」からルートに移動し、各ノードに距離をマークします。これらのノードのすべてを赤色に着色します。 (したがって、ルートはターゲットの深さを保持し、ターゲットは0を保持します)。赤いノードごとに、赤いノードの値から始めて、降りるにつれて1を加えて、赤ではない子を歩きます。

多くの作業を再利用できるため、O(n * n)ではありません。あなたは1つのパスを見つけられず、次に完全に始まり、次のパスを見つける。

+0

私はあなたの意見を見ます。しかし、最適化を使用しないと、それはO(n * n)ではありませんか? –

+0

はい、(ツリーが平衡している場合を除きます)ツリーが平衡している場合、パスはO(log n)を超えることはできませんので、最適化されていないバージョンはO(n log n) –

0

葉のノードから最長パスは、ノードから確実にするために最も深い葉
3.Thingsまでのルートから行くルート
2.Thenへのすべての道を行く
1.だろうこれ許可された場合、パスは任意の2つのノード間を移動して、無限に長くすることができたので、二回のノードを通過しないだろう、複数回

x 
/\ 
    b a 
     \ 
     c 
     \ 
      d 

Cから葉までの最長のパスは2つのこと
1を行うだろう.cからxまで(この長さを数える)
2. xからその経路にcを持たない最も深い葉に移動する(この場合、葉はbである)

以下のコードは、1つのノードから最長の距離を求めるためにO(n) したがってすべてのノードの距離を求めるO(N^2)私の解決策は次のようになり

public int longestPath(Node n, Node root) { 
    int path = 0; 
    Node x = n; 
    while (x.parent != null) { 
     x = x.parent; 
     path++; 
    } 
    int height = maxHeight(root, n); 
    return path + height; 
} 

private int maxHeight(Node x, Node exclude) { 
    if (x == exclude) 
     return -1; 
    if (x == null) 
     return -1; 
    if (x.left == null && x.right == null) 
     return 0; 
    int l = maxHeight(x.left, exclude); 
    int r = maxHeight(x.right, exclude); 
    return l > r ? l + 1 : r + 1; 
} 
+0

です。 cからxへのパス上に見つかったノードのリスト(そして単にcではない)です...私はコードを夕方に修正します – abhaybhatia

0

あろう。

1)ノードにサブツリーがあるかどうかを確認し、そうであればそのサブツリーの高さを見つけます。

2)theresのように、2つの高さ

関連する問題