java二进制搜索树查找父级

时间:2013-03-02 23:58:18

标签: java parent-child binary-search-tree

我正在研究一种寻找阳极母体的方法。我从根开始,然后沿着树叶向下,只要它们不是空的而不是孩子的节点。

下面是我的代码,它有点乱,因为我试图测试它以查看错误。

我拥有的树

        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;
}

3 个答案:

答案 0 :(得分:6)

我会采用不同的方式:在传递当前节点和当前父节点的辅助方法中进行递归。它使一切变得更加简单:

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;
}

答案 1 :(得分:0)

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);
}

Where&#34; Data&#34;是我们需要搜索的父节点的值,R是BST的根节点。 pRoot是我在BST上的其他操作中使用它的全局数据结构。

答案 2 :(得分:-1)

这只是伪代码。当您在节点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;
}