您的位置:首页 > 编程语言 > C语言/C++

C++学习之二叉树算法实现

2014-03-29 22:22 381 查看
#include <iostream>
using namespace std;
//1、创建一个Node节点,包含左右节点的指针和当前节点的数据
typedef char T;
class bst{
struct Node{
T data;
Node * L;
Node * R;
Node(const T & data):data(data),L(),R(){}
Node(const T & data,Node * l,Node * r):data(data),L(l),R(r){}
};
typedef Node * tree;
//构造的类包含 根节点和总的层数
Node * rp;
int n;
public:
//构造方法
bst():rp(),n(){}
void clear(){clear(rp);n=0;}
~bst(){clear();}

//循环打印
void travel(){travel(rp);cout<<endl;};
void insert(const T& p){//增加的方法  采用const修饰则,引用指针  重在了insert方法,
insert(rp,new Node(p));
++n;
}
int size()const{
return n;
}
void update(const T& oldData,const T& newData){
if(remove(oldData)) insert(newData);
}
//查找,输入一个字符,返回地址
tree& find(const T & d){
return find(rp,d);
}
//删除一个字符
bool remove(const T& d){
//先查找是否存在保存该信息 的节点
tree& t = find(d);
if(t == NULL) return false;
Node *p = t;
//如果找到,将左节点插入右节点
if(t->L != NULL)
insert(t->R,t->L);
t = t->R;//原来指向d的指针指向t——R
delete p;//将存储d的空间清空,与上一步顺序不能颠倒
--n;
return true;
}
tree& find(tree& p,const T &d){
if(p == NULL) return p;
if(d == p->data) return p;
if(d<p->data) return find(p->L,d);
if(d>p->data) return find(p->R,d);
}
void clear(tree & rp){
if(rp != NULL){
clear(rp->L);
clear(rp->R);
delete rp;
rp = NULL;
}
}
void travel(tree & rp){
if(rp != NULL){
travel(rp->L);
cout<<rp->data<<endl;
travel(rp->R);
}
}
void insert(tree& rp,Node *p){//引用rp   new Node 返回地址所以 Node *p
if(rp == NULL) //因为rp和p都是指针地址
rp = p;
else if(rp->data<p->data)//递归调用
insert(rp->R,p);
else
insert(rp->L,p);
}

};
int main(int argc,char *argv[]){
bst b;
b.insert('c');
b.insert('a');
b.insert('d');
b.travel();
cout<<b.find('a')->data<<endl;
// delete test
cout<<"#######"<<endl;
b.remove('a');
b.travel();
cout<<"#######"<<endl;
b.update('c','e');
b.travel();
return 0;
}





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: