您的位置:首页 > 其它

二叉查找树的操作

2012-07-07 13:58 363 查看
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct Node
{
int data;
Node* lc,*rc,*parent;
}*BiTree;
BiTree root;
int a[100];
int n;
void CreateTree(BiTree& T ,int v)        // 注意此处类型,对指针的引用,使得指针不会在返回时有变为空指针
{
if(!T)
{
if(!(T=new Node()))  exit(0);
T->data=v;
T->lc=NULL;
T->rc=NULL;
T->parent=NULL;
}
else
{
if(v<T->data)
{
CreateTree(T->lc,v);
T->lc->parent=T;
}
else
{
CreateTree(T->rc,v);
T->rc->parent=T;
}
}
}

void Built(BiTree&T, int v)       //非递归版本
{
BiTree cur,p=T;
while(p)
{
if(p->data==v) return;
cur=p;
p=(p->data>v)? p->lc:p->rc;
}
p=new Node();
p->data=v;
p->lc=p->rc=p->parent=NULL;
if(!T)
T=p;
else
{
p->parent=cur;
if(cur->data>v)
cur->lc=p;
else
cur->rc=p;
}

}

BiTree getMin(BiTree T)
{
while(T->lc)
T=T->lc;
return T;
}

BiTree getMax(BiTree T)
{
while(T->rc)
T=T->rc;
return T;
}

BiTree Successor(BiTree T)         //求后继
{
if(!T)  return T;
if(T->rc)                 //右子树不为空,返回右子树最左边的节点
{
T= getMax(T);
return T;
}
BiTree y=new Node();
y=T->parent;
while(y&&y->rc==T)      //右子树不为空
{
T=y;
y=y->parent;
}
return y;

}

BiTree Precessor(BiTree T)         //求前驱节点
{
if(!T)  return T;
if(T->lc)                 //左子树不为空,返回左子树最右方的节点
{
T= getMin(T);
return T;
}
BiTree y=new Node();      //左子树为空
y=T->parent;
while(y&&y->lc==T)
{
T=y;
y=y->parent;
}
return y;
}

bool DeleteNode(BiTree T)      //当要删除的节点左右节点不为空时,采取的不是删除该节点的方法,而是修改该节点的关键字为其后继节点
{
if(!T)  return false;
BiTree y=new Node();
BiTree x=new Node();
y=T;
if(T->lc&&T->rc)         //当T的左右子树都不为空时,返回的是该点的后继
y=Successor(T);
if(y->lc)
x=y->lc;
else
x=y->rc;
if(x)
x->parent=y->parent;
if(!(y->parent))         //当要删除的节点为根节点时,令x为根节点
root=x;
else
if(y==y->parent->lc)      //修改,删除后继节点后给其他节点指针带来的变化
y->parent->lc=x;
else
y->parent->rc=x;
if(y!=T)                    //将要删除节点的域值改为后继节点的
T->data=y->data;
return true;

}

int Print(int v)
{
printf("%d\n",v);
return 1;
}

int PostOrderTraverse(BiTree T,int(*visit)(int))
{
if(T)
{
PostOrderTraverse(T->lc,visit);
PostOrderTraverse(T->rc,visit);
if(visit(T->data))
return 1;
return 0;
}
return 1;
}
int main()
{
n=0;
int x;
Node* T=NULL;
root =new Node();
root=T;
while(scanf("%d",&x)!=EOF)
{

//	CreateTree(T,x);
Built(T,x);
}
BiTree test=new Node();
test=T;
test=Successor(T);
if(test)
printf("后继是: %d\n",test->data);
else
printf("无后继\n");
test=Precessor(T->lc->lc->rc);
if(test)
printf("前驱是: %d\n",test->data);
else
printf("无前驱\n");
if(DeleteNode(T->lc->lc))
printf("删除成功\n");
PostOrderTraverse(T,Print);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: