2017-01-05 5 views
0

ツリー内で2番目に大きい要素を見つける方法の論理が得られません。ツリー内で2番目に大きい値を見つける方法

public static int largestR(TreeNode<Integer> root){ 
    if(root==null){ 
     return Integer.MIN_VALUE; 
    } 

    int max=root.data; 
    for(int i=0;i<root.children.size();i++){ 

     int n=largestR(root.children.get(i)); 
     if(max<n){ 
      max=n; 
     } 
    } 
    return max; 
} 

ツリーはバイナリではありませんノードは任意の数の子を持つことができます。

あなたは私にその解決策

感謝のコードのアルゴリズムを与えることができればそれは素晴らしいことです。

+5

を? 2つの最大値を追跡することを除いて、それはほぼ同じです。 –

+0

私は最大値を得る方法を知っています。 – nishant

+0

コードを最大限に活用したコードを共有している場合は、2番目に大きなコードを変更する方法を提案できます。 –

答えて

1

あなたはここでは代わりに1

の店舗2つの数字私の実装(構文が正しいことを確認していない)meed:さて、あなたは、ツリー内の最大値を取得する方法を知っています

public static void PushAnswer(int[] m, int value) 
{ 
    if (m[1] >= value) return; 
    if (m[0] >= value) 
    { 
     m[1] = value; 
     return; 
    } 

    m[1] = m[0]; 
    m[0] = value; 
} 

public static void largestR(TreeNode<Integer> root, int[] answer) 
{ 
    if (root == null) 
    { 
     return; 
    } 

    PushAnswer(answer, root.data); 
    for (int i = 0; i < root.children.size(); i++) 
    { 
     largestR(root.children.get(i)); 
    } 
} 

public static int[] getLargestR(TreeNode<Integer> root) 
{ 
    int[] answer = new int[2]; 
    answer[0] = Integer.MIN_VALUE; 
    answer[1] = Integer.MIN_VALUE; 
    largestR(root, answer); 

    return answer; 
} 
+0

これは基本的に正しいです。さて、私は個人的には配列を使用しませんでしたが、読みやすいように2つの変数を渡すだけです。 –

0

ここでは(あまり効率的ではありませんが、動作している)アルゴリズムです。あなたは、リストの中で最も高い要素を見つける方法を知っていると述べました。良い。その要素を削除します。最も高い要素を再度見つけてください!

代替:ソートアルゴリズムを使用してツリーをソートし、2番目の要素を取ります。

ただし、まだ効率が悪いです。最善の方法は、常に最大の2つの要素を追跡する独自のメソッドを作成することです。

+0

ありがとうございました。どうやって教えてくれますか? – nishant

+0

問題の編集したコードが間違っている、それはツリーの最上位レベルのみを見るでしょう、再帰を使ってすべての子を見つける必要があります。しかし、コードの現在の状態では、追加変数を追加します: 'max2'それはあなた自身のために把握することができます;)基本的に子供が現在の最大値より大きいとき:maxは新しいmaxを設定し、古いmaxは 'max2'に等しい。 –

+0

最大の要素を見つけるのに私のコードは機能しませんか? – nishant

関連する問題