社区
数据结构与算法
帖子详情
查找二叉树怎么删除节点
tiancai110a
2012-09-21 01:54:25
左右节点都存在的情况下
语言描述
不要代码
...全文
1858
7
打赏
收藏
查找二叉树怎么删除节点
左右节点都存在的情况下 语言描述 不要代码
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
耶鲁於
2014-10-25
打赏
举报
回复
个人感觉三楼的方法很合理,画一棵树出来再看,一目了然。
tiancai110a
2012-11-27
打赏
举报
回复
答案应该是 遍历左子树找到最大的节点(即左子树最右边的那个节点)或者右子树最小的节点替(即右子树最左边的节点)替换该节点,然后删除那个末端节点,即为了保持原有性质不变
windmissing
2012-09-26
打赏
举报
回复
(1)设要删除的结点是x,x有两个孩子的情况
step1:找到结点x的后继y,可知:y是x右子树中最左结点,且y没有左孩子
step2:把y的关键字给x,即让结点x成为结点y
step3:删除y,因为y没有左孩子,所以按照(2)的方法删除y
(2)设要删除的结点是y,y没有左孩子情况
若y没有右孩子,则直接删除y
若y有右孩子,设y的右孩子为z,y的父结点为p,则让z成为p的孩子,并删除y
palm008
2012-09-26
打赏
举报
回复
分如下几步:代码可以看我的共享
1.删除时只考虑删除,并标记平衡因子
2.根据平衡因子旋转树(这个比较复杂)
xiguaxue
2012-09-22
打赏
举报
回复
分多种情况讨论
1.被删除节点没有子树的情况,直接删除,并修改对应父节点的指针为空。
2.对于只有一个子树的情况,考虑将其子树作为其父节点的子树,关于是左还是右,根据被删除的节点确定。
3.最复杂的是有两个子数的情况,可以考虑两种方法,都是同样的思想:用被删除节点A的左子树的最右节点或者A的右子树的最左节点作为替代A的节点,并修改相应的最左或最右节点的父节点的指针,修改方法类似2
/**********删除二叉树节点的操作***********/
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;
}
}
}
mkcing
2012-09-22
打赏
举报
回复
1,找到其后继,处理后继右子树
2,用后继代替
mkcing
2012-09-22
打赏
举报
回复
1,找到这节点的后继,先处理后继的右子树,后继没有左子树
2,用后继代替这个要删除的节点
二叉树
遍历,
查找
,
删除
节点
,线索化
二叉树
很明显就只有两个分叉,及左子
节点
和右子
节点
,这里主要是说明
二叉树
的遍历,
查找
节点
和
删除
节点
,线索化这几种。 遍历分为前序遍历,中序遍历,后序遍历这三种,前,中,后是相对中间
节点
来说的,及前序比那里是先中间
节点
,在左边
节点
,最后右边
节点
。 下面是前序遍历代码: public void preOrder(){ System.out.println(this); if(this.left!...
二叉树
查找
、插入、遍历、
删除
节点
1、
二叉树
节点
的类: package Tree; //
二叉树
节点
public class Node { // 数据项 public int data; // 左子
节点
public Node leftChild; // 右子
节点
public Node rightChild; // 构造方法 public Node(int data) { this.data = dat...
二叉树
的遍历、
查找
、
节点
删除
//定义树 class BinaryTree{ private Hero root; public void setRoot(Hero root) { this.root = root; } //前序遍历 public void perOrder(){ if(this.root!=null){ this...
搜索
二叉树
节点
的
查找
与
删除
(C语言)
#include <stdio.h> #include <stdlib.h> /*创建一颗 搜索
二叉树
结构体*/ typedef struct TreeNode{ int data; struct TreeNode *leftTree; struct TreeNode *rightTree; }TreeNode; /*中序递归遍历*/ /* 递归的本质是压栈 */ void mid_travel(TreeNode *Node) { if(
普通
二叉树
遍历、
查找
、
删除
节点
手动创建一个
二叉树
如图 代码 public class Main { public static void main(String[] args) { //手动创建树 HeroNode heroNode1 = new HeroNode(1,"宋江"); HeroNode heroNode2 = new HeroNode(2,"吴用"); HeroNode heroNode3 = new HeroNode(3,"卢俊义");
数据结构与算法
33,025
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章