C 从二叉树中删除
我对二叉树有个问题。在我的代码中,我计划实现添加、删除和打印等功能。虽然添加和打印效果很好,但我在删除时遇到了麻烦。我的想法-问题在于指针。我通过2个指针添加,1个指针删除,但我不知道如何让它工作。请帮忙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) ==
#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;i printf(“%d您不能简单地删除二叉树的一个节点。您可以很容易地删除一个叶,只需将父节点的lchild或rchild partner设置为null。但是,如果不删除内部节点的所有子节点,则无法删除该节点。您可以做的是旋转该节点,以使左侧子节点(或右侧子节点)能够成为子树的根,根成为子树。将新的子树根重新附加到树上。重复此操作,直到您希望删除的节点最终成为叶,然后将其删除。您不能简单地删除二叉树的节点。您可以很容易地删除叶,只需将父节点的lchild或rchild伙伴设置为null。但是如果不同时删除内部节点的所有子节点,则无法删除该节点。您可以旋转该节点,使左(或右)子节点成为子树的根,根成为子树。将新的子树根重新附加到树上。重复此操作,直到最后要删除的节点成为叶,并将其删除。调试器…………您需要调试此操作,并使用一个非常重要的工具:一支铅笔和一张纸。请阅读此;您有void delete_node()
和tr->lchild=delete_node()
;所以这都是胡说八道。请在以前启用所有编译器警告。正在尝试。要编写任何代码。调试器………您需要调试它,并使用一个非常重要的工具:一支铅笔和一张纸。请阅读此;void delete_node()
和tr->lchild=delete_node()
;所以这都是胡说八道。请在以前启用所有编译器警告。尝试编写任何代码。