2014-12-06 25 views
1

我填滿了一棵二叉樹,然後我嘗試通過遞歸方法獲得某個葉子的父親。每個節點包含字符串數據;假設我只用每個葉子的「*」初始化字符串數據。 在這種方法中,我遍歷樹,直到找到給定節點(葉),所以我可以返回父節點。 找到葉子後,我想檢查節點(葉子)是否與我正在搜索的目標相同。 不幸的是,情況並非如此,並且該方法返回父級首先發現的葉子。 我已經使用.equals()方法和「==」運算符,但它們都不起作用。 有誰知道如何解決這個問題?對象不同,但得到低谷.equals函數和'=='運算符

BinaryNode root = new BinaryNode("root",2); 
    BinaryNode na = new BinaryNode("a",2); 
    BinaryNode naLeaf1= new BinaryNode("*",0); 
    BinaryNode naLeaf2 = new BinaryNode("*",0); 
    na.addChild(naLeaf1); 
    na.addChild(naLeaf2); 
    BinaryNode nb = new BinaryNode("b",2); 
    BinaryNode nbLeaf1= new BinaryNode("*",0); 
    BinaryNode nbLeaf2 = new BinaryNode("*",0); 
    nb.addChild(nbLeaf1); 
    nb.addChild(nbLeaf2); 
    root.addChild(na); 
    root.addChild(nb); 

這是遍歷二叉樹的遞歸方法。

public BinaryNode getParent(BinaryNode root, BinaryNode target) { 

    if(root!=null) { 
     for(BinaryNode ni: root.childeren) { 
      if(!ni.data.equals("*")) { 
       return getParent(ni, target); 
      }else { 
       if(ni.equals(target)) { 
        return root; 
       } 
      } 
     } 
    } 
    return root; 
} 

我已經爲.equals方法添加了覆蓋,但似乎沒有解決問題。

@Override 
public boolean equals(Object target) { 
    if(target==null) return false; 
    if(target==this) return true; 
    if(!(target instanceof BinaryNode)) return false; 
    return false; 
} 
+0

如果您不覆蓋equals,則其行爲與==相同。 – 2014-12-06 15:01:58

+0

BinaryNode覆蓋默認的equals()實現嗎?如果是這樣,你可以展示它嗎? – 2014-12-06 15:02:09

+0

@鄒鄒,謝謝! – c0s1n3 2014-12-06 15:03:39

回答

2

你的問題不是'equals'方法,而是你使用的算法。首先,BinaryNode是否將父項作爲字段?如果不是,那麼認真考慮補充一點。

如果你真的不想讓每個節點知道它的父節點,那麼你需要遍歷整個樹,而不是一個分支。類似以下內容:

public BinaryNode getParentOf(BinaryNode target) { 

    for(BinaryNode child: children) { 
     if (child == target) { 
      return this; 
     } 
     BinaryNode result = child.getParentOf(target); 
     if (result != null) { 
      return result; 
     } 
    } 
    return null; 
} 

但嚴重的是,確保每個節點都知道它的父節點。

+0

你是對的算法,我照顧它。我還將父屬性添加到BinaryNode類。非常感謝 ! – c0s1n3 2014-12-06 16:23:32

1

在你的.equals()重寫中,你需要做一些精確地分隔兩個這樣的對象的計算。如何檢查您所提供的參數,如果它們的roottarget相同,那麼這些對象是相等的。

0

看看第一個if條件!ni.data.equals("*")。這個評估爲false,對吧?因爲你爲所有葉子設置了數據'*'。 此ni.equals(target)的計算結果也爲false,因爲您的equals方法沒有任何問題,並且按預期工作。 這對所有的孩子都是這樣,你走出循環,並返回root

你需要重新思考這個函數的邏輯,這是錯誤的。雖然equals並沒有錯(儘管你不需要像這樣覆蓋它,可以使用==)。

相關問題