博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树节点的删除
阅读量:7029 次
发布时间:2019-06-28

本文共 2538 字,大约阅读时间需要 8 分钟。

昨天在看书的时候,突然看到二叉查找树的删除,以前学过,不过学的不仔细,结果研究了一晚上,才把二叉树的删除操作给整出来。

唉,以后看书要仔细啊。。。。。

先说一下如何删除二叉树查找树的节点吧。总共有三种情况

1.被删除的节点是叶子节点,这时候只要把这个节点删除,再把指向这个节点的父节点指针置为空就行

2.被删除的节点有左子树,或者有右子树,而且只有其中一个,那么只要把当前删除节点的父节点指向被删除节点的左子树或者右子树就行。

3.被删除的节点既有左子树而且又有右子树,这时候需要把左子树的最右边的节点或者右子树最左边的节点提到被删除节点的位置,为什么要这样呢,根据二叉查找树的性质,父节点的指针一定比所有左子树的节点值大而且比右子树的节点的值小,为了删除父节点不破坏二叉查找树的平衡性,应当把左子树最大的节点或者右子树最小的节点放在父节点的位置,这样的话才能维护二叉查找树的平衡性。(我是找的右子树的最小节点)

 

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long#define INF 0x3f3f3f3fusing namespace std;struct node{ int value ; node * left; node * right;};typedef node * pnode;void add(pnode & it,int i){ if (it==nullptr) { it=new node; it->value=i; it->left=nullptr; it->right=nullptr; } else { pnode k=it; pnode now=new node; now->value=i; now->left=nullptr; now->right=nullptr; while(1) { if (i<=k->value) { if (k->left!=nullptr) { k=k->left; } else { k->left=now; break; } } else { if (k->right!=nullptr) { k=k->right; } else { k->right=now; break; } } } }}void show(pnode it){ queue
que; que.push(it); while(que.size()) { pnode x=que.front(); cout<
value<<" "; que.pop(); if (x->left!=nullptr) { que.push(x->left); } if (x->right!=nullptr) { que.push(x->right); } }}void Delete(pnode & it,int val){ pnode k,j=it; while(j->value!=val&&j) { if (val<=j->value) { k=j; j=j->left; } else { k=j; j=j->right; } } if (j==nullptr) { cout<<"无该点"<
left==nullptr&&j->right==nullptr)//当这是个叶子节点 { if (j==it)//如果删除的节点是根节点,直接删除置空 { delete it; it=nullptr; } else//如果删除的节点不是根节点,把指向删除节点的指针置空 { if (k->left==j) { k->left=nullptr; } else { k->right=nullptr; } delete j; } } else if (j->left==nullptr||j->right==nullptr)//左子树不为空或者右子树不为空 { if (j->left!=nullptr)//如果是左子树不为空 { if(it==j) { it=j->left; } else { if (k->left==j) { k->left=j->left; } else { k->right=j->left; } } delete j; } else { if(it==j) { it=j->right; } else { if (k->right==j) { k->left=j->right; } else { k->right=j->right; } } delete j; } }/*看清楚这时候的删除操作,删除的不是j节点了,删除的是把值赋给j节点的节点,因为这时候这个节点已经被提到父节点的位置*/ else if (j->left!=nullptr&&j->right!=nullptr)// { pnode pp=j; pnode p=j->right; while(p->left!=nullptr) { pp=p; p=p->left; } j->value=p->value; if (j==pp) { j->right=p->right; } else { pp->left=p->right; } delete p; }}int main(){/*我用的测试数据8 7 4 13 16 21 1 18 3 22*/ pnode a=nullptr; int p; for (int i=0;i<10;i++) { cin>>p; add(a,p); } cout<<"删除节点3"<

 

 

转载于:https://www.cnblogs.com/GregZQ/p/8365301.html

你可能感兴趣的文章
Acm Dima and Lisa的题解
查看>>
2017 ZSTU寒假排位赛 #7
查看>>
深入浅出Tomcat系列
查看>>
从网页提取的关键字
查看>>
位运算符
查看>>
PHP str_replace() 和str_ireplace()函数
查看>>
什么是全栈工程师
查看>>
Html5新特性
查看>>
linux下简易端口扫描器
查看>>
HDU 1205
查看>>
Openstack-L 路由注入方式
查看>>
利用ROS工具从bag文件中提取图片
查看>>
Java常用类库
查看>>
Android开发之Activity转场动画
查看>>
List集合三种遍历方法
查看>>
【译】OpenDaylight控制器:YANG Schema和Model
查看>>
C#访问修饰符(public,private,protected,internal,sealed,abstract)
查看>>
android消息线程和消息队列
查看>>
EXCEL中计算不重复单元格的个数
查看>>
二层设备与三层设备的区别--总结
查看>>