树的删除操作
2015-12-30 16:56
162 查看
#include <stdio.h> class Node { public: Node * left; Node * right; Node * pre; int data; Node(int d,Node* p=NULL):data(d),left(0),right(0),pre(p) {} }; void insert(Node* head,int a) { if(head->data > a) { if(head->left==NULL) head->left=new Node(a,head); else insert(head->left,a); }else { if(head->right==NULL) head->right=new Node(a,head); else insert(head->right,a); } } void preorder_print(Node* d) { if(!d) return; preorder_print(d->left); printf("%d ",d->data); preorder_print(d->right); } void transplant(Node* d,Node *u,Node *r) { if(u->pre==NULL){ *d=*r; delete r; } else if(u->pre->left==u) u->pre->left=r; else u->pre->right=r; if(r) r->pre=u->pre; delete u; } //find minnum node Node* minnum_node(Node* d) { if(d->left==NULL) return d; return minnum_node(d->left); } //delete the first where data equals 'num' void delete_node(Node* root,Node* d,int num) { if(d->data==num) { if(d->left==NULL) transplant(root,d,d->right); else if(d->right==NULL) transplant(root,d,d->left); else { auto min=minnum_node(d->right); if(min->pre!=d) transplant(root,min,min->right); transplant(root,d,min); min->pre=d->pre; min->right=d->right; min->right->pre=min; min->left=d->left; min->left->pre=min; delete d; } } else if(d->data>num) delete_node(root,d->left,num); else delete_node(root,d->right,num); } void release(Node* d) { if(d->left!=NULL) release(d->left); if(d->right!=NULL) release(d->right); delete d; } int main() { Node* head=new Node(5); int data[]={1,6,2,4,7,9,10,3}; for(int i=0;i<sizeof(data)/sizeof(int);++i) insert(head,data[i]); preorder_print(head); putchar('\n'); delete_node(head,head,3); preorder_print(head); putchar('\n'); release(head); return 0; }
相关文章推荐
- ReentrantLock实现自己的BlockingQueue
- 移动前端头部标签(HTML5 head meta)
- oracle 分组查询取第一条数据 关联查询 最后一条数据
- netty4 如何建立心跳机制
- web.xml配置文件中的servlet和servlet-mapping
- 软件重构
- 错误提示:Wrong Local header signature: 0xE011CFD0
- Style Scope Agile Edition—免费版商业智能产品
- JSONArray用法jquery循环list<Map>对象
- objective c下的对象模型
- ES6学习——新的语法:对象解构(Object Destructuring)
- cell中有一个按钮,点击按钮删除本行cell,并有系统自带的由右向左的效果(效果有多种)
- spring 与 mybatis整合,mybatis注解不起作用
- AIDL中使用java类
- 高德地图基本使用
- [转载]通天塔导游:各种编程语言的优缺点
- Junit原理详解四
- 交互式设计--如何让你的界面简约
- 树莓派输出电流设置
- HTTPS、SPDY、HTTP/2 对比