二叉树怎么删除节点

二叉树怎么删除节点,第1张

二叉树删除节点分多种情况讨论:

被删除节点没有子树的情况,直接删除,并修改对应父节点的指针为空。

对于只有一个子树的情况,考虑将其子树作为其父节点的子树,关于是左还是右,根据被删除的节点确定。

最复杂的是有两个子数的情况,可以考虑两种方法,都是同样的思想:用被删除节点A的左子树的最右节点或者A的右子树的最左节点作为替代A的节点,并修改相应的最左或最右节点的父节点的指针,修改方法类似2 。

以下是用C写的参考代码:

/删除二叉树节点的 *** 作/

btree deletenode(btree root,int node)

{

 btree parent;

 btree point;

 btree child;

    int postion;

 parent=binary_search(root,node,&postion); 

 //二叉树为空的情况

   if(parent==NULL)

  return root;

   else

   {

    switch(postion)

   { case -1:point=parent->left;break;

  case 1 :point=parent->right;break;

  case  0 :point=parent;break;

   }

 if(point->left==NULL&&point->right==NULL)

 {

  switch(postion)

  {

         case -1:parent->left=NULL;break;

         case 1:parent->right=NULL;break;

         case 0:parent=NULL;break;

  }

    free(point);

   return root;

    }

 if(point->left==NULL&&point->right!=NULL)

  {

   if(postion==-1)

    parent->left=point->right;

   else

    if(postion==1)

    parent->right=point->right;

    else

     root=root->right;

   free(point);

   return root;

  }

  

 if(point->left!=NULL&&point->right==NULL)

 {

  if(postion==-1)

   parent->left=point->left;

  else

   if(postion==1)

    parent->right=point->left;

   else

    root=root->left;

  return root;

 }

 if(point->left!=NULL&& point->right!=NULL)

 {

  parent=point;

  child=point->left;

  while(child->right!=NULL)

  {

   parent=child;

   child=child->right;

  }

  point->data=child->data;

  if(parent->left=child)

   parent->left=child->left;

  else

   parent->right=child->left;

  free(child);

  return root;

    }

  }

}

temp=p;

p=p->next;

temp->next=NULL;

这三句存在问题,temp=p,让temp指向p所指向的节点,p=p->next,p指向后移

temp->next=NULL,让temp的后继为空,这里出了问题,链表从temp指向的节点断开,相当于删除p之后的所有节点。

应该先判断p是不是最后节点

if(p->next==NULL)

如果是,只好去找p的前趋pre,让pre->next=NULL,free(p)

如果不是最后节点,将p的后继节点数值域复制给p,然后将p的后继节点删除,等同与删除p

p->data=p->next->data;

p->next=p->next->next;

free(p);

首先你要明白一点,你建立的单链表,单链表有两个域,一个是数据域,一个是指针域。数据域就不说了,主要是指针域。这个指针域就是我们设置的next。这个next它只指向后继,不指向前驱,所以可以片面地说,如果在一个指针域只有next指针的单链表中,对于一个节点来说,它的联系只有后继,没有前驱。前驱就是前一个元素,后继就是后一个元素。因为指针域就一个next用来指向后继,没有指针指向前驱。除非你的指针域有两个指针,一个是next指向后继,一个是front指向前驱,那就可以了。

你这里,主要是用Del_X_3(L->next,x);语句,指向了它的后继,也即是它的下一个元素。由于没有front指针,所以无法指出前驱。(可以通过特殊方法得到,但你这个程序当中,不用考虑)

其中L一直没有变,你能懂吗?通过Del_X_3(L->next,x);它的遍历顺序是这样的:

L->next (指向头指针指向的下一个元素,也就是第一个后继)

L->next->next (第二个后继,是头指针下下个元素)

L->next->next->next (第三个后继,是头指针下下下个元素)

L->next->next->next->next (第四个后继,是头指针下下下下个元素)

现在懂了木有?呵呵

删除决策树里的节点单击节点上的删除图标即可。决策树以决策节点为出发点,引出若干方案枝,每条方案枝代表一个方案。方案枝的末端有一个状态节点,从状态节点引出若干概率枝,每条概率枝代表一种自然状态的决策方法。单击节点上的删除图标,即可将该节点删除。删除后,其所有子节点也将一并删除。

既然有ListNode,就应该有List类,将removeElements封装到List类中,由List类负责内存的分配和释放;

这样责任就清晰了。

再就是结点的分配一般都是在堆上申请,在栈上连接起来的结点当然无法删除;

如果非得需要按照这样的实现,在栈上应用list,那么只用更改结点指针就好了,不用delete,栈上的即结点在退出程序逻辑范围时自动删除了;

选择删除节点按钮,这样就可以把选择的节点删除掉。

具体的 *** 作方法如下:

1、把鼠标光标移至要删除的节点上,

2、然后点击把它选择,

3、接下来在属性栏中点击删除按钮,

4、这样就可以把这个节点删除掉了。

以上就是关于二叉树怎么删除节点全部的内容,包括:二叉树怎么删除节点、c语言中删除链表中的一个节点、求指教,下面这个程序是怎么实现删除单链表中值为X的节点的,请详细说明。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9685554.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存