儿童Java的二进制搜索树布尔检查

时间:2016-05-03 19:59:37

标签: java binary-search-tree

我有一个项目,我必须在其中创建一个bst。所以我的问题是我必须创建一个布尔方法,在其中检查节点是否是他父亲的右/左子节点。

public class TreeNode 
{
  private int data;
  private TreeNode right;
  private TreeNode left;
  private TreeNode parent;

 **assesor and mutator methods**

  public TreeNode (int data)
  {
    this.data = data;
    right = null;
    left = null;
  }
  public boolean isRightChild (TreeNode parent)
  {
    if (parent.right.data == data)      
    {
        return true;
    }
    return false;
  }

  public boolean isLeftChild (TreeNode parent)
  {
    if (parent.left.data == data)       
    {
        return true;
    }
    return false;
  }
}

我在另一个类中使用this ...

调用此方法
node2.isRightChild(parent)

node2.isLeftChild(parent)

在编译器中它向我显示NullPointerException 插入方法(在另一个类中)是......

public void insert(int data)
{
    TreeNode element = new TreeNode (data);
    if (node == null)
    {
        node = element;
        return;
    }
    TreeNode node2 = node;
    TreeNode parent = null;
    while(true)
    {
        parent = node2;
        if (data < node2.getData())
        {
            node2 = node2.getLeft();
            if (node2 == null)
            {
                parent.setLeft(element);
                return;
            }
        }else
        {
            node2 = node2.getRight();
            if(node2 == null)
            {
                parent.setRight(element);
                return;
            }
        }
    }
}

更新:我的删除方法如下......

public boolean remove(int data)
{
    TreeNode parent = node;
    TreeNode node2 = node;

    //searching through the nodes
    while(node2.getData() != data)
    {
        parent = node2;
        if(node2.getData() > data)
        {
            node2 = node2.getLeft();
        }else
        {
            node2 = node2.getRight();
        }
    }
    //empty node
    if (node == null)
    {
        return false;
    }
    //leaf
    if(node2.isLeaf(data))
    {
        if(node2 == node)
        {
            node = null;
        } 
        if(node2.isRightChild(parent))
        {
            parent.setRight(null);
        }else
        {
            parent.setLeft(null);
        }
    }

    //node with 1 child
    else if((node2.getLeft() == null))
    {
        if (node2 == node)
        {
            node = node2.getRight();
        }else if(parent.isRightChild(node2))
        {
            parent.setRight(null);
        }else
        {
            parent.setLeft(null);
        }
    }
    else if((node2.getRight() == null))
    {
        if(node2 == node)
        {
            node = node2.getLeft();
        }else if (node2.isLeftChild(parent))
        {
            parent.setLeft(null);
        }else
        {
            parent.setLeft(null);
        }
    }
    //node with 2 children
    else if ((node2.getLeft() != null) && (node2.getRight() !=null))
    {
        TreeNode min = minFromRightSide(node2);
        if(node2 == node)
        {
            node = min;
        }else if(node2.isLeftChild(parent))
        {
            parent.setLeft(min);
        }else
        {
            parent.setRight(min);
        }
        min.setLeft(node2.getLeft());
    }
    return true;
}

所以完成问题的是,使用这个remove方法,当节点有一个子节点而不是删除1个节点时,它会删除这个节点和他的孩子...所以当我试图删除子节点后,我显然有NullPointerException

1 个答案:

答案 0 :(得分:0)

您检查错误。抛出NullPointerException,因为当没有左或右子时,它指向什么。

试试这个

public boolean isRightChild (TreeNode parent)
  {
    if (parent.right != null) //checks if a right child exists     
    {
        return true;
    }
    remove(parent);
    return false;
  }

  public boolean isLeftChild (TreeNode parent)
  {
    if (parent.left != null)  //checks if a left child exists     
    {
        return true;
    }
    remove(parent);
    return false;

  }

<强>更新 如果你想在这里删除节点是一种可以做到这一点的方法。 (我将它用于我的BST)

private void remove(Node node)
   {
      E theData;
      Node parent, replacement;
      parent = findParent(node);
      if ((node.left != null) && (node.right != null))
      {
         replacement = node.right;
         while (replacement.left != null)
            replacement = replacement.left;
         theData = replacement.data;
         remove(replacement);
         node.data = theData;
      }
      else
      {
         if ((node.left == null) && (node.right == null))
            replacement = null;
         else if (node.left == null)
            replacement = node.right;
         else
            replacement = node.left;
         if (parent==null)
            root = replacement;
         else if (parent.left == node)
            parent.left = replacement;
         else
            parent.right = replacement;
      }
   }