2017-05-08 2 views
0

を動作していないようFindParentバイナリツリー私のBNODEクラス方法はここ

class BNode 
{ 
    public int number; 
    public BNode left; 
    public BNode right; 
    public BNode(int number) 
    { 
     this.number = number; 
    } 
} 

そして、ここではFindParent方法の私の実装です

public BNode FindParent(BNode BNode, BNode searchNode) 
    { 
     if (searchNode.left == BNode || searchNode.right == BNode) 
     { 
      return searchNode; 
     } 
     if (searchNode.left != null) 
     { 
      return (FindParent(BNode, searchNode.left)); 
     } 
     if (searchNode.right != null) 
     { 
      return (FindParent(BNode, searchNode.right)); 
     } 
     return null; 
    } 

は、私はそれを呼び出す方法です

BNode bnodeFound = btree.Find(18); 
    BNode bparent = btree.FindParent(bnodeFound, btree.rootNode); 

And here is how the tree looks like

数値がツリールートの最初のルートである場合を除き、常にnullを返します。私はまた、トラフのデバッグが、一番左のルートに行き、正しいルートがないことを確認してからnullを返すということを発見しました。これを理解しようとしましたが、成功しませんでした。私は同様の方法でツリー内の数字を見つけると、それを見つけるために働きます。

答えて

0

左のノード(ヌルでない)のたびにFindParent()を再帰的に呼び出すと、正しいノードのFindParent()は決して呼び出されません。

// Assume we run this for the root node 
if (searchNode.left != null) 
{ 
    // If left node is not null, then it tries to find in left subtree only 
    // Since it returns directly, whether found or not-found it WILL NOT 
    // search in right sub-tree 
    return (FindParent(BNode, searchNode.left)); 
} 

// Unreachable code if left is not NULL 
if (searchNode.right != null) 
{ 
    return (FindParent(BNode, searchNode.right)); 
} 

修正するには、return文を削除して、まだ見つからないかどうかを確認します。

if (searchNode.left != null) 
{ 
    var found = (FindParent(BNode, searchNode.left)); 
    // Return if found, else continue to check in right 
    if (found != null) return found; 
} 

// Checks in right sub-tree if not found in left subtree 
if (searchNode.right != null) 
{ 
    // While checking in right sub-tree, then return irrespective of whether 
    // it was found or not found, since there aren't any more places to check 
    return (FindParent(BNode, searchNode.right)); 
} 
+0

リターンコールを削除し、BNode returnNodeに戻り、nullでないかどうかをチェックします。ありがとうございました! –

関連する問題