二叉搜索树删除节点功能

问题描述 投票:0回答:1

当我尝试删除仅具有正确子节点的节点时,我的删除功能不起作用。当节点仅具有左子节点或具有左和右节点时,它可以工作。

我想知道这是否是解决此问题的有效方法。我知道如何用C ++编写代码,但我也需要它在C#中工作。

//Private method, with args: root node, node to be deleted
private Node DeleteN(Node root, Node deleteNode) 
{
    if (root == null)
    {
        return root;
    }
    if (deleteNode.data < root.data)
    {
        root.left = DeleteN(root.left, deleteNode);
    }
    if (deleteNode.data > root.data)
    {
        root.right = DeleteN(root.right, deleteNode);
    }
    if (deleteNode.data == root.data)
    {
        //No child nodes
        if (root.left == null && root.right == null)
        {
            root = null;
            return root;
        }
        //No left child - DONT WORK
        else if (root.left == null)
        {
            Node temp = root;
            root = root.right;
            temp = null;
        }
        //No right child
        else if (root.right == null)
        {
            Node temp = root;
            root = root.left;
            temp = null;
        }
        //Has both child nodes
        else
        {
            Node min = FindMin2(root.right);
            root.data = min.data;
            root.right =  DeleteN(root.right, min);
        }
    }
    return root;
}

//Public method with arg: int value of node to be deleted
public void DeleteNode(int x)
{
    Node deleteNode = new Node(x);
    DeleteN(root, deleteNode);
}
c# binary-search-tree treenode
1个回答
0
投票

实际上,您的代码有效。我已经删除了else,如果是no left child,并且我只有一个if语句,如果if语句,则无法访问,

//No child nodes
if (root.left == null && root.right == null)
{
    root = null;
    return root;
}
//No left child - DONT WORK
else if (root.left == null)  //WORKS NOW-missed else, it has been only if
{
    Node temp = root;
    root = root.right;
    temp = null;
}
//No right child
else if (root.right == null)
{
    Node temp = root;
    root = root.left;
    temp = null;
}
© www.soinside.com 2019 - 2024. All rights reserved.