Data structures 二叉搜索树的查找祖先方法不工作

Data structures 二叉搜索树的查找祖先方法不工作,data-structures,parent,binary-search-tree,nullreferenceexception,Data Structures,Parent,Binary Search Tree,Nullreferenceexception,我已经编写了在C#(C-sharp)中查找节点父节点的方法,但是我的代码工作不正常。异常:尝试删除其父节点为null的节点时,将引发System.NullReferenceException public TreeNode FindParent(int value, ref TreeNode parent) { TreeNode currentNode = root; if (currentNode == null) {

我已经编写了在C#(C-sharp)中查找节点父节点的方法,但是我的代码工作不正常。异常:尝试删除其父节点为null的节点时,将引发System.NullReferenceException

    public TreeNode FindParent(int value, ref TreeNode parent)
    {
        TreeNode currentNode = root;

        if (currentNode == null) 
        {
            return null;
        }

        while (currentNode.value != value)
        {
            if (value < currentNode.value)
            {
                parent = currentNode; 
                currentNode = currentNode.leftChild;  

            }
            if (value > currentNode.value)
            {
                parent = currentNode;  
                currentNode = currentNode.rightChild; 
            }
        }
        return currentNode;

    }


    public void Delete(int value)
    {
        TreeNode parent = null;
        TreeNode nodeToDelete = FindParent(value, ref parent);

        if (nodeToDelete == null)
        {
            throw new Exception("Unable to delete node: " + value.ToString());
        }



            //CASE 1: Nod has 0 children. 
        if (nodeToDelete.leftChild == null && nodeToDelete.rightChild == null) 
         {

                if (parent.leftChild == nodeToDelete) 
                {
                    parent.leftChild = null;
                }

                if (parent.rightChild == nodeToDelete) 
                {
                    parent.rightChild = null; 
                }
                count--; 
                return; 

            }
            //CASE 2: Nod has 1 left || 1 right barn 
            if (nodeToDelete.leftChild == null && nodeToDelete.rightChild != null)
            {
                nodeToDelete.rightChild = parent.rightChild;
                nodeToDelete = null;      
                count--;
                return; 

            }

            if (nodeToDelete.leftChild != null && nodeToDelete.rightChild == null)
            {
                nodeToDelete.leftChild = parent.leftChild;
                nodeToDelete = null;  
                count--;
                return; 

            }

            //CASE 3: Nod has 2 children 
            if (nodeToDelete.rightChild != null && nodeToDelete.leftChild != null)
            {
                TreeNode successor = LeftMostNodeOnRight(nodeToDelete, ref parent);
                TreeNode temp = new TreeNode(successor.value);
                if (parent.leftChild == successor)
                {
                    parent.leftChild = successor.rightChild;
                }
                else
                {
                    parent.rightChild = successor.rightChild; nodeToDelete.value = temp.value;
                }
                count--;
                return; 

            }

    }  
public树节点FindParent(int值,ref树节点父节点)
{
TreeNode currentNode=根节点;
if(currentNode==null)
{
返回null;
}
while(currentNode.value!=值)
{
if(值当前节点值)
{
父节点=当前节点;
currentNode=currentNode.rightChild;
}
}
返回当前节点;
}
公共无效删除(int值)
{
TreeNode父节点=null;
TreeNodeToDelete=FindParent(值,参考父级);
if(nodeToDelete==null)
{
抛出新异常(“无法删除节点:+value.ToString());
}
//案例1:Nod有0个子项。
if(nodeToDelete.leftChild==null&&nodeToDelete.rightChild==null)
{
if(parent.leftChild==nodeToDelete)
{
parent.leftChild=null;
}
if(parent.rightChild==nodeToDelete)
{
parent.rightshild=null;
}
计数--;
返回;
}
//案例2:Nod有一个左| |一个右谷仓
if(nodeToDelete.leftChild==null&&nodeToDelete.rightChild!=null)
{
nodeToDelete.rightChild=parent.rightChild;
nodeToDelete=null;
计数--;
返回;
}
if(nodeToDelete.leftChild!=null&&nodeToDelete.rightChild==null)
{
nodeToDelete.leftChild=parent.leftChild;
nodeToDelete=null;
计数--;
返回;
}
//案例三:诺德有两个孩子
if(nodeToDelete.rightChild!=null&&nodeToDelete.leftChild!=null)
{
树节点后继节点=LeftMostNodeOnRight(nodeToDelete,ref-parent);
树节点温度=新树节点(后续值);
if(parent.leftChild==继任者)
{
parent.leftChild=继任者.rightChild;
}
其他的
{
parent.rightChild=succession.rightChild;nodeToDelete.value=temp.value;
}
计数--;
返回;
}
}  

由于您使用的是递归,因此不需要父节点来删除二元搜索树中的节点,这里有一个delete方法,您可以在其中传入int和root

private BinaryTreeNode  remove (int value, TreeNode t){

    if(t==null)
        return t; // not found; do nothing

    if(value < t.value){
        t.left = remove(x,y,t.left);
    }
    else if (value > t.value){
        t.right = remove(x,y,t.right);
    }
    else if( t.left!=null && t.right != null) // two children
    {
        t.info = findMin(t.right).info; 
        remove(t.info.getLastName(),y,t.right);
    }
    else{                           // one child 
        if (t.left != null) { 
              t = t.left;
        }     
        else{ 
            t = t.right;
        }   
    }
    return t; 

}
因此,您从右子树中获取最小值,并使其成为t.info的父级。遵循这些图表。我们正在删除带有两个子节点的节点25


t.Info=findMin(t.right).Info//Info在这里和findMin都代表什么?一条建议——在学习编程时,你应该先学习调试——这会让你有机会在发布之前回答一些无关紧要的问题:)我觉得你的评论没有建设性。如果你没有任何贡献,请不要发表评论。当然,我正在尽我最大的努力进行调试,请详细描述你这样评论时的推理方式
private BinaryTreeNode  findMin ( BinaryTreeNode  t){  // recursive
        if(t == null)
            return null;
        else if (t.left == null)
            return t;
        return findMin(t.left);
    }