您的位置:首页 > 其它

排序二叉树实现及其基本操作

2013-05-19 17:25 267 查看
#include<iostream>
#define ElemType int
#define NULLDATA -1
using namespace std;

typedef struct TREE_NODE *link;

typedef struct TREE_NODE
{
ElemType data;
link right ;
link left ;

}TREE_NODE;

link T;  //全局根节点变量

void Insert(ElemType v)  //插入操作
{
link current;
link *head = &T;

while((*head) != NULL)
{

if(v < (*head)->data)
head = &(*head)->left;
else
head = &(*head)->right;

}
current = (link)malloc(sizeof(TREE_NODE));
current->data = v;
current->left = NULL;
current->right = NULL;
(*head) = current;

}

ElemType Delete(link head,ElemType v)
{
link h = head; // 记录要删除的结点
link aux = head; //aux 记录要删除结点的前驱
link p ;   //  p 记录要替换删除结点的前驱
link ptr;  //  ptr记录要替换的结点
while(h->data != v)
{
aux = h;
if(v < h->data)
h = h->left;
else
h = h->right;

}

if(h->left == NULL && h->right == NULL) //第一种情况:要删除结点(叫做Z,导论里的叫法)没有子女
{ cout<<"111 "<<aux->data<<endl;
if(aux->left == h)
{	aux ->left = NULL; cout<<"hhh"<<endl;}
else
{
aux->right = NULL;
cout<<"SSS"<<endl;
}
return h->data;

}
else if(h->left == NULL || h->right == NULL) // 第二种情况: Z 只有一个子女
{ cout<<"222"<<aux->data<<endl;
if(aux->left = h)
{ if(h->left != NULL)
aux->left = h->left;
if(h->right != NULL)
aux->left = h->right;
}
else
{   if(h->right != NULL)
aux->right = h->right;
if(h->left != NULL)
aux->left = h->left;
}
return h->data;
}

else                                           //第三种情况: Z有两个子女
{ cout<<"333 h->right is"<<h->right->data<<endl;
p = h->right;
if(p->left == NULL)
{
p->left = h->left;
if(aux->left == NULL)
{	  aux->right = p;

}
else
{
aux->left = p;
}
}
else
{
while(p->left->left != NULL  )  //找到要替换结点的前驱
{
p = p->left;
}
ptr = p->left; // 要替换的结点
if(ptr->right != NULL)
p->right = ptr->right;
p->left = NULL;
ptr->left = h->left;
ptr->right= h->right;
aux->left = ptr;
}
return h->data;
}
}

ElemType find_1(link head,ElemType v) //查找版本1
{ link h = head;
if( h == NULL || h->data == v)
{return h->data;}
else
return NULLDATA;

if(v < h->data)
find_1(h->left,v);
else
find_1(h->right,v);

}

ElemType find_2(link head,ElemType v)  //非递归版本,导论上说一般来说,非递归版本一般要比递归运行的快。
{ link h = head;
while(v != h->data && h != NULL)
{
if(v < h->data)
h = h->left;
else
h = h->right;
}

if( h != NULL)
return h->data;
else
return NULLDATA;

}

int count(link head)  //统计结点个数
{
if(head == NULL) return 0;
return count(head->left) + count(head->right) +1;

}

int height(link head)   //计算二叉树的高度
{
int r_h,l_h,max;
link h = head;
if(h != NULL)
{
r_h = height(h->left);
l_h = height(h->right);
max = (r_h > l_h) ? r_h:l_h;
return (max+1);
}
else
return 0;

}

ElemType out_max(link head) //输出二叉树的最大值
{ link h = head;
while(h->right != NULL)
{
h = h->right;

}

return h->data;
}

ElemType out_min(link head) //输出二叉树的最小值
{
link h = head;
while(h->left != NULL)
{
h = h->left;
}

return h->data;
}

void pre_traverse(link  head)  //前序遍历
{
link h = head;

if(h == NULL)  return ;
cout<<h->data<<endl;
pre_traverse(h->left);
pre_traverse(h->right);
}

void post_traverse(link head)  //后序遍历
{
link h = head;

if(h == NULL) return ;
post_traverse(h->left);
post_traverse(h->right);
cout<<h->data<<endl;

}

void in_traverse(link head)  //中序遍历
{
link h = head;

if(h == NULL) return ;
in_traverse(h->left);
cout<<h->data<<endl;
in_traverse(h->right);

}

int main()
{
Insert(13);    //一系列的插入
Insert(12);
Insert(28);
Insert(11);
Insert(33);
Insert(2);
Insert(29);
Insert(56);
Insert(10);
Insert(23);
Insert(6);
Insert(7);
Insert(53);
Insert(80);
Insert(90);
Insert(91);
cout<<"pre_traverse:"<<endl;
pre_traverse(T);
cout<<"in_traverse:"<<endl;
in_traverse(T);
cout<<"post_traverse:"<<endl;
post_traverse(T);
cout<<"The element is "<<find_1(T,18)<<endl;
cout<<"The element is "<<find_2(T,12)<<endl;
cout<<"The number of all element is "<<count(T)<<endl;
cout<<"The height of binary tree is "<<height(T)<<endl;
cout<<"----------------------------"<<endl;
cout<<"The max element is "<<out_max(T)<<endl;
cout<<"---------------------------------"<<endl;
cout<<"The min element is "<<out_min(T)<<endl;
cout<<"Delete the element is "<<Delete(T,53)<<endl;
cout<<"int_traverse after delete :"<<endl;
in_traverse(T);
return 0;
}


参考:导论 P151 ~ P157 重点是删除操作的三种情况 以及 插入操作实现和《算法:C实现》的区别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: