C 从二叉树中删除

C 从二叉树中删除,c,binary-tree,C,Binary Tree,我对二叉树有个问题。在我的代码中,我计划实现添加、删除和打印等功能。虽然添加和打印效果很好,但我在删除时遇到了麻烦。我的想法-问题在于指针。我通过2个指针添加,1个指针删除,但我不知道如何让它工作。请帮忙 #include <stdio.h> #include <stdlib.h> #include "bintree.h" void paste_node(Tree ** tr, int x) { Tree *tree_bin; if ((*tr) ==

我对二叉树有个问题。在我的代码中,我计划实现添加、删除和打印等功能。虽然添加和打印效果很好,但我在删除时遇到了麻烦。我的想法-问题在于指针。我通过2个指针添加,1个指针删除,但我不知道如何让它工作。请帮忙

#include <stdio.h>
#include <stdlib.h>

#include "bintree.h"

void paste_node(Tree ** tr, int x)
{
    Tree *tree_bin;
    if ((*tr) == NULL) {
        tree_bin = (Tree *) malloc(sizeof(Tree));
        tree_bin->item = x;
        tree_bin->lchild = tree_bin->rchild = NULL;
        *tr = tree_bin;
        return;
    }

    if (x < (*tr)->item) {
        paste_node(&((*tr)->lchild), x);
    } else {
        paste_node(&((*tr)->rchild), x);
    }
}

Tree * minimum(Tree *tr)
{
    if (tr->lchild == NULL) return tr;
    return minimum(tr->lchild);
}

void delete_node(Tree ** tr, int num)
{ 
    if (tr == NULL) return;

    if (num < tr->item)
        tr->lchild = delete_node(tr->lchild, num);
    else if (num > tr->item)
        tr->rchild = delete_node(tr->rchild, num);
    else {
        if (tr->lchild == NULL) {
            Tree *tree_bin = tr->rchild;
            free(tr);
            return;
        }
        else if (tr->rchild == NULL) {
            Tree *tree_bin = tr->lchild;
            free(tr);
            return;
        }

        Tree *tree_bin = minimum(tr->rchild);
        tr->item = tree_bin->item;
        tr->rchild = delete_node(tr->rchild, tree_bin->item);
    }

    return;
}

void print_tree(Tree *tr, int depth)
{
    if (tr != NULL) {
        print_tree(tr->lchild, depth + 1);
        for(int i = 0; i < depth; ++i) printf("   ");
        printf("%d<\n", tr->item);
        print_tree(tr->rchild, depth + 1);
    }
}

int check_node(Tree **tr, int x) {
    if ((*tr) == NULL) {
        return 1;
    }

    if (x < (*tr)->item) {
        check_node(&((*tr)->lchild), x);
    } else if (x == (*tr)->item) {
        return -1;
    } else {
        check_node(&((*tr)->rchild), x);
    }
}
#包括
#包括
#包括“bintree.h”
无效粘贴节点(树**tr,int x)
{
Tree*Tree_bin;
如果((*tr)==NULL){
tree_bin=(tree*)malloc(sizeof(tree));
树\u bin->item=x;
tree\u bin->lchild=tree\u bin->rchild=NULL;
*tr=树_bin;
返回;
}
如果(x<(*tr)->项){
粘贴_节点(&(*tr)->lchild),x;
}否则{
粘贴_节点(&(*tr)->rchild),x;
}
}
树*最小值(树*tr)
{
如果(tr->lchild==NULL)返回tr;
返回最小值(tr->lchild);
}
void delete_节点(树**tr,int num)
{ 
如果(tr==NULL)返回;
如果(numitem)
tr->lchild=delete_节点(tr->lchild,num);
否则如果(num>tr->item)
tr->rchild=delete_节点(tr->rchild,num);
否则{
如果(tr->lchild==NULL){
树*Tree_bin=tr->rchild;
免费(tr);
返回;
}
else if(tr->rchild==NULL){
树*Tree_bin=tr->lchild;
免费(tr);
返回;
}
Tree*Tree_bin=最小值(tr->rchild);
tr->item=tree\u bin->item;
tr->rchild=delete_节点(tr->rchild,tree_bin->item);
}
返回;
}
无效打印树(树*tr,整型深度)
{
如果(tr!=NULL){
打印树(tr->lchild,深度+1);
对于(int i=0;iprintf(“%d您不能简单地删除二叉树的一个节点。您可以很容易地删除一个叶,只需将父节点的lchild或rchild partner设置为null。但是,如果不删除内部节点的所有子节点,则无法删除该节点。您可以做的是旋转该节点,以使左侧子节点(或右侧子节点)能够成为子树的根,根成为子树。将新的子树根重新附加到树上。重复此操作,直到您希望删除的节点最终成为叶,然后将其删除。

您不能简单地删除二叉树的节点。您可以很容易地删除叶,只需将父节点的lchild或rchild伙伴设置为null。但是如果不同时删除内部节点的所有子节点,则无法删除该节点。您可以旋转该节点,使左(或右)子节点成为子树的根,根成为子树。将新的子树根重新附加到树上。重复此操作,直到最后要删除的节点成为叶,并将其删除。

调试器…………您需要调试此操作,并使用一个非常重要的工具:一支铅笔和一张纸。请阅读此;您有
void delete_node()
tr->lchild=delete_node()
;所以这都是胡说八道。请在以前启用所有编译器警告。正在尝试。要编写任何代码。调试器………您需要调试它,并使用一个非常重要的工具:一支铅笔和一张纸。请阅读此;
void delete_node()
tr->lchild=delete_node()
;所以这都是胡说八道。请在以前启用所有编译器警告。尝试编写任何代码。