算法导论二叉搜索树
来源:互联网 发布:淘宝经营类目怎么修改 编辑:程序博客网 时间: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);
}
- 算法导论-----二叉搜索树
- 算法导论-----------二叉搜索树
- 算法导论 二叉搜索树
- 算法导论--二叉搜索树
- 【算法导论】二叉搜索树
- 算法导论二叉搜索树
- 算法导论 二叉搜索树
- 算法导论二叉搜索树
- 算法导论 二叉搜索树
- [算法导论]第十二章《二叉搜索树》
- 【算法导论】最优二叉搜索树
- 二叉搜索树(算法导论)
- 算法导论-----------------最优二叉搜索树
- 【算法导论】第九课 二叉搜索树
- 算法导论学习之--二叉搜索树
- 算法导论12(二叉搜索树)
- 算法导论笔记:12二叉搜索树
- 算法导论 12章 二叉搜索树
- HTML中meta标签的作用与使用
- Java 开发之:POI XLS和XLSX兼容解析及单元格数据转换工具代码
- 事件处理模式
- SVProgressHUD的基本使用
- 浅谈缓冲区溢出问题
- 算法导论二叉搜索树
- PAT (Advanced Level) Practise 1001. A+B Format (20)
- 搭建Nginx代理服务及配置
- 动态规划之背包问题
- 学习资料整理
- Android 中文API (33) —— Checkable
- 【华为机试题】图书录入与检索
- Java第五部分
- hive函数参考手册