Description
给出一个数据序列,建立二叉排序树,并实现删除功能
对二叉排序树进行中序遍历,可以得到有序的数据序列
Input
第一行输入t,表示有t个数据序列
第二行输入n,表示首个序列包含n个数据
第三行输入n个数据,都是自然数且互不相同,数据之间用空格隔开
第四行输入m,表示要删除m个数据
从第五行起,输入m行,每行一个要删除的数据,都是自然数
以此类推输入下一个示例
Output
第一行输出有序的数据序列,对二叉排序树进行中序遍历可以得到
从第二行起,输出删除第m个数据后的有序序列,输出m行
以此类推输出下一个示例的结果
Sample
Input
1 6 22 33 55 66 11 44 3 66 22 77
Output
11 22 33 44 55 66 11 22 33 44 55 11 33 44 55 11 33 44 55
#include <iostream>
using namespace std;
class Node {
public:
int data,index;
Node *left,*right,*parent;
Node() {
left = right =NULL;
}
Node(int _data,int _index){
data = _data;
index = _index;
left = right =NULL;
}
~Node(){}
};
class Tree {
public:
Node *root;
Tree() {
root = NULL;
}
};
void insert(Node *&node,int data,int index){
if(node == NULL){
node = new Node(data,index);
return ;
}
if(node->data < data){
insert(node->right,data,index);
}else{
insert(node->left,data,index);
}
}
void insertTree(Node *&node,Node *targeNode){
if(node == NULL){
node = targeNode;
return;
}
if(node->data < targeNode->data) insertTree(node->right,targeNode);
else insertTree(node->left,targeNode);
}
void display(Node *node){
if(node == NULL) return ;
display(node->left);
cout<< node->data <<" ";
display(node->right);
return ;
}
void delete_node(Node *node,int targe,Node *parent){
if(!node) return;
if(targe > node->data) delete_node(node->right,targe,node);
else if(targe < node->data) delete_node(node->left,targe,node);
else{
if(node == parent->left) parent->left = NULL;
if(node == parent->right) parent->right = NULL;
if(node->left) insertTree(parent,node->left);
if(node->right) insertTree(parent,node->right);
delete node;
}
return;
}
int main() {
int t;
cin>>t;
while(t--) {
Tree tree;
int n,m,data;
cin>>n;
for(int i=0;i<n;i++) {
cin >> data;
insert(tree.root,data,i);
}
display(tree.root);
cout << endl;
cin>>m;
while(m--) {
cin>>data;
if(tree.root){
if(tree.root->data == data){
Node *del = tree.root;
tree.root = tree.root->left;
if(del->right) insertTree(tree.root,del->right);
delete del;
}
else delete_node(tree.root,data,NULL);
}
display(tree.root);
cout<<endl;
}
}
return 0;
}
把被删除的位置设置为空,然后重新插入左子树和右子树就是函数insertTree。写这篇是因为在网上找不到很简洁的。