给出一个数据序列,建立二叉排序树,并实现删除功能
对二叉排序树进行中序遍历,可以得到有序的数据序列
标签:nbsp roo cno ndt 功能 输出 结果 root 个数
给出一个数据序列,建立二叉排序树,并实现删除功能
对二叉排序树进行中序遍历,可以得到有序的数据序列
第一行输入t,表示有t个数据序列
第二行输入n,表示首个序列包含n个数据
第三行输入n个数据,都是自然数且互不相同,数据之间用空格隔开
第四行输入m,表示要删除m个数据
从第五行起,输入m行,每行一个要删除的数据,都是自然数
以此类推输入下一个示例
第一行输出有序的数据序列,对二叉排序树进行中序遍历可以得到
从第二行起,输出删除第m个数据后的有序序列,输出m行
以此类推输出下一个示例的结果
当删除数据不在序列中,那么删除操作等于不执行,所以输出序列不变化
#include<iostream> using namespace std; class CNode { public: int data; CNode *left; CNode *right; CNode() { left=right=NULL; } }; class BStree { public: CNode *root; BStree() { root=NULL; } void addTree(int number) { CNode *t=root; while(true) { if(number<t->data) { if(t->left==NULL) { t->left=new CNode(); t->left->data=number; return; } else { t=t->left; } } else { if(t->right==NULL) { t->right=new CNode(); t->right->data=number; return; } else { t=t->right; } } } } int findtimes(int number) { CNode *t=root; int times=1; while(true) { if(t==NULL) return -1; if(number==t->data) return times; else if(number<t->data) { t=t->left; times++; } else { t=t->right; times++; } } return times; } CNode *findptr(int number) { CNode *t=root; while(true) { if(t==NULL) return NULL; if(number==t->data) return t; else if(number<t->data) t=t->left; else t=t->right; } return NULL; } CNode *findptrparent(int number) { CNode *t=root; CNode *parent=NULL; while(true) { if(t==NULL) return NULL; if(number==t->data) return parent; else if(number<t->data) { parent=t; t=t->left; } else { parent=t; t=t->right; } } return NULL; } int Delete(int number) { CNode *t=findptr(number); CNode *parent=NULL; if(t!=NULL) { parent=findptrparent(number); } while(true) { if(t==NULL)///t空,没找到,返回0 { return 0; } if(t!=NULL&&parent==NULL)///t不空,parent空,是根 { if(t->left==NULL&&t->right!=NULL) { root=t->right; return 0; } else if(t->right==NULL&&t->left!=NULL) { root=t->left; return 0; } else if(t->left==NULL&&t->right==NULL) { root=NULL; return 0; } } if(number==t->data) { if(t->left==NULL&&t->right==NULL) { if(parent->left==t) parent->left=NULL; else if(parent->right==t) parent->right=NULL; delete t; return 1; } else if(t->left==NULL&&t->right!=NULL) { CNode *temp=t->right; if(parent->left==t) parent->left=temp; else if(parent->right==t) parent->right=temp; delete t; return 1; } else if(t->left!=NULL&&t->right==NULL) { CNode *temp=t->left; if(parent->left==t) parent->left=temp; else if(parent->right==t) parent->right=temp; delete t; return 1; } else///左右都不空 { CNode *S=t->left; CNode *Q=t; if(S->right==NULL) { t->data=S->data; t->left=S->left; delete S; return 1; } while(S->right!=NULL) { Q=S; S=S->right; } t->data=S->data; Q->right=S->left; delete S; return 1; } } return 0; } } void printTree(CNode *p) { if(p) { printTree(p->left); cout<<p->data<<" "; printTree(p->right); } } }; int main() { int T; cin>>T; while(T--) { int n; cin>>n; BStree Tree; for(int i=0;i<n;i++) { int c; cin>>c; if(i==0) { Tree.root=new CNode(); Tree.root->data=c; } else { Tree.addTree(c); } } Tree.printTree(Tree.root); cout<<endl; int m; cin>>m; while(m--) { int ch; cin>>ch; Tree.Delete(ch); Tree.printTree(Tree.root); cout<<endl; } } return 0; }
标签:nbsp roo cno ndt 功能 输出 结果 root 个数
原文地址:https://www.cnblogs.com/SZU-DS-wys/p/12183065.html