算法导论二叉搜索树

来源:互联网 发布:淘宝经营类目怎么修改 编辑:程序博客网 时间:2024/06/07 23:07

两天写完的,没有认认真真的测试,可能有些BUG,自己测试的数据能过,但是我的初始化有些问题,不知道该怎么表示

//二叉搜索树
#include<iostream>
#include<cstdlib>
using namespace std;
struct Node{
Node *p,*lchild,*rchild;
int key;
Node()
{
p=NULL;
lchild=NULL;
rchild=NULL;
key=-1;
}
};
void inorder_Search(Node *root1)
{
Node *root=root1;
if(root!=NULL)
{
inorder_Search(root->lchild);
printf("%d ",root->key);
inorder_Search(root->rchild);
}
}
Node* Tree_Search(Node *root1,int x)
{
Node *root=root1;
if(root==NULL||root->key==x)
return root;
if(x>root->key)
Tree_Search(root->rchild,x);
else
Tree_Search(root->lchild,x); 
}
Node* Itertive_Tree_Search(Node *root,int x)
{
// Node *root=root1;
while(root!=NULL || x!=(root->key))
{
if(x<root->key)
root=root->lchild;
else
root=root->rchild;
}
return root;
}
Node* Tree_Min(Node *root1)
{
Node *root=root1;
while(root->lchild!=NULL)
root=root->lchild;
return root;
}
Node* Tree_Max(Node *root1)
{
Node *root=root1;
while(root->rchild!=NULL)
root=root->rchild;
return root;
}
Node* Tree_Successor(Node *x1)//x的后继元素 
{
Node *x=x1;
if(x->rchild!=NULL)//右孩子最小的 
return Tree_Min(x->rchild);
Node *y=x->p;
while(y!=NULL && x==y->rchild)//找x的第一个左孩子祖先 
{
x=y;
y=y->p;
}
return y;
}
Node* Tree_Predecessor(Node *x1)//x的前继元素
{
Node *x=x1;
if(x->lchild!=NULL)
return Tree_Max(x->lchild);
Node *y=x->p;
while(y!=NULL && x==y->lchild)//找X的第一个右孩子祖先 
{
x=y;
y=y->p;
}
return y;
}
void Tree_Insert(Node *root,int z)
{
Node *y=(Node *)malloc(sizeof(Node));
Node *x=root;
while(x!=NULL)
{
y=x;
if(z<(x->key))
x=x->lchild;
else
x=x->rchild;
}
Node *zz=new Node();
zz->key=z;
zz->p=y;
if(y==NULL)
root=zz;
else if(y->key>z)
y->lchild=zz;
else
y->rchild=zz;
}
void Transplant(Node *root,Node *u,Node *v)//用v来替换u,换过去,把父子关系确立 
{
if(u->p==NULL)
root=v;
else if(u==u->p->lchild)//u是一个左孩子,首先先父子链接 
u->p->lchild=v;
else
u->p->rchild=v;
if(v!=NULL) //孩子和父亲链接 
v->p=u->p; 
}
void Tree_Delete(Node *root,Node *z)
{
if(z->lchild==NULL)//没有左孩子,就把右孩子换上来 
Transplant(root,z,z->rchild);
else if(z->rchild==NULL)//没有右孩子,就把左孩子换上来 
Transplant(root,z,z->lchild);
else//两个孩子都有,找这个节点的后驱元素,就是右孩子最小的元素 
{
Node *y=NULL;
y=Tree_Min(z->rchild);
if(y->p!=z)//y不是z的右孩子,后驱在下下层 ,就先让y的右孩子顶上y的位置 
{
Transplant(root,y,y->rchild);
//把z的右孩子给y当右孩子 让z的右孩子认y当父亲 
y->rchild=z->rchild;
y->rchild->p=y;
//这就相当于Y成为了Z的直接右孩子后驱 
}
//y是z的直接后驱,是他的右孩子,让Y顶替Z后,把Z的左儿子给Y 
Transplant(root,z,y);
y->lchild=z->lchild;
y->lchild->p=y;

}
}
void init(Node *root)
{
(root)->lchild=NULL;
(root)->rchild=NULL;
(root)->p=NULL;
(root)->key=-1;
}
int main()
{
Node *root=(Node *)malloc(sizeof(Node));
init(root);
for(int i=1;i<=10;i+=2)
Tree_Insert(root,i);
inorder_Search(root);
cout<<endl;
for(int i=2;i<=10;i+=2)
Tree_Insert(root,i);
inorder_Search(root);
cout<<endl;
Node *e=Tree_Search(root,5);
Tree_Delete(root,e);
inorder_Search(root);
}

0 0
原创粉丝点击