查找二进制搜索树的Ancestor方法不起作用

时间:2014-11-12 10:53:21

标签: 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) 
        {
            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; 

            }

    }  

1 个答案:

答案 0 :(得分:0)

因为你正在使用递归,所以你不需要父节点来删除二进制搜索树中的节点,这里有一个删除方法,你传入int和根

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; 

}

编辑----------- findMin(在二叉搜索树中找到最小节点)

private BinaryTreeNode  findMin ( BinaryTreeNode  t){  // recursive
        if(t == null)
            return null;
        else if (t.left == null)
            return t;
        return findMin(t.left);
    }

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

enter image description here enter image description here enter image description here