如何创建解决方案以从常规树中删除子树

时间:2019-05-26 08:02:13

标签: c++ data-structures tree recursive-datastructures

我目前正在做一个创建通用树的项目,该树可以有很多孩子,而父母到孩子的方式是通过第一个孩子(使用指向第一个孩子的指针),而第一个孩子的兄弟姐妹没有指向其父母的指针,而仅指向其下一个(如果有节点)和上一个(相同)的指针,因此兄弟姐妹仅包含2个指针,第一个孩子具有3个指针(父,右,子)。

所以这是问题开始的地方,我创建了removeNode()来删除当前节点而不使用递归函数,然后我不得不删除所选节点(当前)的子树,我试图使用递归,但仍然无法t用我的removeNode()函数找出删除子树的解决方案。是否可以使用递归函数删除我的案例中的DeleteSubtree或有其他方法?

我尝试使用while(pointer-> next!= NULL)来检查孩子是否有兄弟姐妹的递归函数,而在while中我使用if(pointer-> child!= NULL)并在其中使用if使用递归函数deleteSubTree(pointer-> child);在点头有任何点头​​的情况下,让指针移动孩子。之后,在if函数之外,我使用指针=指针->下一个转到他们的下一个兄弟姐妹。我使用deleteNode()来删除最右边的兄弟(如果有的话)。此逻辑的问题是,如果删除了最右边的节点,则指针将不会移到要删除的上一个节点。

这是deleteNode()函数:

void deleteNode()
{   
    if(current -> child == NULL)
    {
        if(current == root)
        {
            free(root);
            cout << "Last Node can't delete !'" << endl;
        }
        else if(current->next == NULL && current->previous == NULL)
        {
            temp2 = current->parent;
            free(current);
            current = temp2; 
        }
        else if(current->next == NULL)
        {
            temp2 = current->previous;
            free(current);
            current = temp2;
        }
        else if(current->previous == NULL)
        {
            temp = current->parent;
            temp2 =current->next;
            temp->child = temp2;
            temp->child->parent = temp;
            temp2->previous = NULL;
            current->next = NULL;
            free(current);
            current = temp2;
        }
        else
        {
            temp = current->previous;
            temp2 = current->next;
            temp->next = current->next;
            temp->next->previous = temp;
            free(current);
            current = temp2;
        }
    }
    else
    {
        temp = current->child;
        if(current == root)
        {
            if(temp ->next == NULL)
            {
                free(root);
                root = temp;
                current = root;
            }
            else
            {
                cout << "rootes2";
                free(root);
                root = temp;
                temp = current->next;
                current = root;
                cout << "ON ROOT";
            }
        }
        else
        {
            if(temp ->next == NULL)
            {
                free(root);
                root = temp;
                current = root;
            }
            else
            {
                free(current);
                current = temp;
                root = current;
                temp = current->next;
                current->child = temp;
                current->child->parent = current;
            }
        }
    }
}

这是deleteSubTree函数:

void deleteSubTree(node* pointer)
{   

    while (pointer->next != NULL) 
    {
        if (pointer->child != NULL) 
        {
            deleteSubTree(pointer->child);  
        }
        cout << "test";
        pointer = pointer->next;
        //temp2 = pointer->previous;
    }

    deleteNode();
}

我为根添加1,为根的第一个孩子添加2,为第一个孩子的兄弟添加3,然后为兄弟的第一个孩子添加4。

此后,我回到了第一个孩子的父级,即值为3的兄弟姐妹,我运行deleteSubTree,结果将是值为4的无穷循环,如果我打印当前节点,它将只有4

0 个答案:

没有答案