2017-03-27 12 views
0

バイナリツリーのルートからリーフへのパスの合計を計算しようとしています。動作していないようですが、doesItの値はtrueになりますが、再帰的なので、スタックがポップするとfalseに戻ります。それを修正する方法がわからない。 どのようにしてdoItの値がtrueに変わるとスタック全体に伝播するようにコードを変更するのですか? [5,4,8,11、NULL、NULL、NULL、7,2] 順序どおりバイナリツリーのパスの合計を計算する

そう5は、二人の子供4及び8を有する4は1子11を有し、8:

ツリーを検討しますあなただけの子供にメソッドを呼び出すことで、指定した値を投げる子

hasPathSum(ルート、22)

public boolean hasPathSum(TreeNode root, int sum) { 
    boolean doesIt = false; 
    if (root != null) 
    { 
     doesIt = pathSum(root, sum, 0, doesIt); 
    } 
    return doesIt; 
} 

private static boolean pathSum(TreeNode root, int sum, int sumSoFar, boolean doesIt) 
{ 
    if (root.left == null && root.right == null) 
    { 
     if (sumSoFar+root.val == sum) 
     { 
      doesIt = true; 
      return doesIt; 
     } 
     return doesIt; 
    } 

    if (root.left != null) 
    { 
     pathSum(root.left, sum, sumSoFar+root.val,doesIt); 
    } 

    if (root.right != null) 
    { 
     pathSum(root.right, sum, sumSoFar+root.val,doesIt); 
    } 

    return doesIt; 
} 
+0

7と2はどうなりますか?ツリーを描き、答えを更新する。 – Vaibs

+1

'pathSum'がそれ自身を再帰的に呼び出すとき、内側の' pathSum'呼び出しは値を返しますが、あなたはそれを使用しません。これらの戻り値を使用するようにメソッドを修正するだけで済みます。私は方法が何をすべきか理解していないので、どのようにして、私はどのように理解できません。 – ajb

答えて

0

を持っていません。私は少しこれにあなたのコードを書き換える:

private static boolean pathSum(TreeNode root, final int sum, int sumSoFar) { 
    if (root == null) return false; 
    if (root.left == null && root.right == null) return sumSoFar + root.val == sum; 
    return pathSum(root.left, sum, sumSoFar + root.val) || pathSum(root.right, sum, sumSoFar + root.val); 
} 

それは基本的な再帰です:nullノードの答えのために、葉は2つの分岐の1つで成功を達成しようとしている別のコーナーケース、一般的なケースの定義ではfalseです。

P.S.あなたが達成しようとしている質問とメソッドのシグネチャからはあまり明確ではありませんが、ルートから任意の葉までのパスがあるかどうかを確認すると仮定します。