花了一整天的时间琢磨,算是明白一点指针的使用了
输入样例:
21
20 10 30 5 15 25 35 3 6 11 28 2 7 27 29 8 9 40 33 34 26
这是一个二叉顺序树用链表实现,然后添加与删除根据函数来。
代码:
#include <iostream>
#include <stdlib.h>
using namespace std;
struct tree{
int data;
tree *left;
tree *right;
};
typedef struct tree *b_tree;
b_tree insert(b_tree root,int node){
// cout << "循环" << endl;
b_tree parentnode;
b_tree currentnode;
b_tree newnode;
newnode=(b_tree)malloc(sizeof(tree));
newnode->data=node;
newnode->right=NULL;
newnode->left=NULL;
if(root==NULL)
return newnode;
else{
currentnode=root;
while(currentnode!=NULL){
parentnode=currentnode;
if(currentnode->data<node)
currentnode=currentnode->right;
else
currentnode=currentnode->left;
}
if(parentnode->data<node)
parentnode->right=newnode;
else
parentnode->left=newnode;
}
return root; //此处为root,对应上面的currentnode=root,始终从root开始对比后添加
}
b_tree creat(int node[],int len){
b_tree root=NULL;
for(int i=1;i<=len;i++)
root=insert(root,node[i]);
return root;
}
void print(b_tree root){
if(root!=NULL){
print(root->left);
printf("%d ",root->data);
print(root->right);
}
}
int find(b_tree root,int node){
if(root==NULL){
return 0;
}else if(root->data==node){
return 1;
}else if(root->data<node){
find(root->right,node);
}else{
find(root->left,node);}
}
b_tree tree_delete(b_tree root,int node){
b_tree parentnode;
b_tree currentnode;
//currentnode=(b_tree)malloc(sizeof(tree));
currentnode=root;
if(currentnode->data==node){
parentnode=root;
if(currentnode->right!=NULL&¤tnode->left!=NULL){
// cout << "根两边都有" << endl;
parentnode=root;
currentnode=currentnode->right;
while(currentnode->left!=NULL){ //如果不经过这个循环,则parentnode为根节点
parentnode=currentnode;
currentnode=currentnode->left; //找到后继点
}
if(parentnode==root&¤tnode->right!=NULL){
// cout << "右边的左下无" << endl;
parentnode->right=currentnode->right;
}else if(currentnode->right!=NULL){
// cout << "右边的左下有" << endl;
parentnode->left=currentnode->right;
}
root->data=currentnode->data;
root->right=NULL;
}else if(currentnode->right==NULL||currentnode->left==NULL){ //左右结点均不存在
root=NULL;
}else if(currentnode->right!=NULL){
root=currentnode->right;
}else if(currentnode->left!=NULL){
root=currentnode->left;
}
}else{
while(currentnode->data!=node){
parentnode=currentnode;
if(currentnode->data<node)
currentnode=currentnode->right;
else
currentnode=currentnode->left;
}
cout << currentnode->data << endl;
if(currentnode->right!=NULL&¤tnode->left!=NULL){
// cout << "2个" << endl;
b_tree currentnode2=currentnode;
parentnode=currentnode;
currentnode=currentnode->right;
while(currentnode->left!=NULL){
// cout << "左边存在" << endl;
parentnode=currentnode;
currentnode=currentnode->left;
}
if(parentnode!=currentnode2)parentnode->left=NULL;//如果parentnode改变过,那么后继的父节点的左必定没先,除非后面加
if(parentnode==currentnode2&¤tnode2->right!=NULL){
// cout << "有节点无左" << endl;
parentnode->right=currentnode->right;
}else if(currentnode->right!=NULL){
// cout << "有结点有左" << endl;
parentnode->left=currentnode->right;
}
currentnode2->data=currentnode->data;
}else if(currentnode->right==NULL&¤tnode->left==NULL){
if(parentnode->data>node)
parentnode->left=NULL;
else
parentnode->right=NULL;
// cout << "两个都没" << endl;
}else if(currentnode->right!=NULL){
// cout << "右边在" << endl;
parentnode->left=NULL;
if(parentnode->data>node)
parentnode->left=currentnode->right;
else
parentnode->right=currentnode->right;
}else if(currentnode->left!=NULL){
//cout << "左边在" << endl;
if(parentnode->data>node) //如果成立则删除的结点在他的左边
parentnode->left=currentnode->left;
else
parentnode->right=currentnode->left;
}
}
return root;
}
int main(){
freopen("in.txt","r",stdin);
int n,i;
b_tree root;
cin >> n;
int node[n+1];
for(i=1;i<=n;i++)
cin >> node[i];
root=creat(node,n);
print(root);
cout << endl;
//tree_delete(root,10);
// if(find(root,b))
// cout << "找到" << endl;
// else
// cout << "找不到" << endl;
return 0;
}