簡體   English   中英

Java二進制搜索樹找到父級

[英]java binary search tree find parent

我正在研究尋找陽極母體的方法。 我從根開始,然后沿着葉子走,只要它們不為空且不是子節點。

下面是我的代碼,有點混亂,因為我正在嘗試對其進行測試以查看出現了什么問題。

我有的樹是

        10
      /    \
     2     20
      \   / \
       3 18 22
            /
           21

被傳入的x是20,所以10是父級,但是當我運行它時,22成為父級。 while循環似乎不起作用,是我寫的方式嗎?

public Node<E> findParent(E x)
{
Node<E> node = root;

System.out.println("node is " + node.getData() + " before the search");
System.out.println("The value of x is " + x);
System.out.println("The value of node.getRight is " + node.getRight().getData());
boolean test = !node.getRight().getData().equals(x);
System.out.println("does nodes data equal x " + test);
while(((node!=null) && (node.getLeft()!=null) && (!node.getLeft().getData().equals(x))) || 
 ((node != null) && (node.getRight()!=null) && (!node.getRight().getData().equals(x))))
{ System.out.println("why didnt it stop");
    if(x.compareTo(node.getData()) < 0)
    {
        node = node.getLeft();
    }
    else
    {
        node = node.getRight();
    }
}
 System.out.println("node is " + node.getData() + " after the search");
return node;
}

我會做不同的事情:在傳遞當前節點和當前父節點的輔助方法中進行遞歸。 它使一切變得更加簡單:

public Node<E> findParent(E x) {
    return findParent(x, root, null);
}

public Node<E> findParent(E x, Node<E> node, Node<E> parent)
{
    if (node == null) {
        return null;
    } else if (!node.getData().equals(x)) {
        parent = findParent(x, node.getLeft(), node);
        if (parent == null) {
            parent = findParent(x, node.getRight(), node);
        }
    }
    return parent;
}
private static void myparent(int data, Node R) 
{
    if( (R.left!=null && R.left.data == data) || (R.right!=null) &&(R.right.data == data) )
    {
        pRoot = R;
        return;
    }
    if (R.data <= data)
        myparent(data, R.right);
    else
        myparent(data, R.left);
}

其中“數據”是我們需要搜索其父節點的節點的值,R是BST的根節點。 pRoot是我在BST上的其他操作中使用的全局數據結構。

這只是偽代碼。 當您在節點x ,請檢查左右節點中的(要找到其父項的子項)鍵。 如果它們匹配,那么您已經在父級了。 如果不是,那么沿元素方向移動並再次執行是安全的。

請注意,在繼續之前,我們將檢入下一級。

while(node!=null){

  if(node.left==key || node.right==key) return node;

  if(key<node.data) node=node.left;

  else node=node.right;

  return null;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM