最近写了一个简单的二叉树,仅供查考,代码如下:
#include <iostream>
using namespace std;
typedef char T;
class bst
{
struct Node
{
T data;
Node* L;
Node* R;
Node(const T& d):data(d),L(),R(){}
Node(const T& d,Node* l,Node* r):data(d),L(l),R(r){}
};
typedef Node* tree;
Node* rp;
int n;
public:
bst():rp(),n(){}
~bst()
{
clear();
}
void clear()
{
clear(rp);
n = 0;
}
void insert(const T& d)
{
insert(rp,new Node(d));
++n;
}
tree& find(const T& d)
{
return find(rp,d);
}
void travel()const
{
travel(rp);
cout << endl;
}
bool empty()const
{
return rp == NULL;
}
int size()const
{
return n;
}
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;
delete p;
--n;
return true;
}
const T& root()const
{
if(rp == NULL) throw "空";
return rp->data;
}
void update(const T& olddata,const T& newdata) //修改节点的数据
{
if(remove(olddata))
insert(newdata);
}
private:
static void insert(tree& t,Node* p) //在树中插入一个节点
{
if(t == NULL)
t = p;
else if(p->data < t->data)
insert(t->L,p);
else
insert(t->R,p);
}
static tree& find(tree& t,const T& d) //返回已d为根节点的子树的根指针
{
if(t == NULL) return t; //没找到
else if(t->data == d) return t; //找到了
else if(d < t->data)
return find(t->L,d);
else
return find(t->R,d);
}
static void travel(tree t) //遍历
{
if(t != NULL)
{
travel(t->L);
cout << t->data << ' ';
travel(t->R);
}
}
static void clear(tree& t) //清空
{
if(t != NULL)
{
clear(t->L);
clear(t->R);
delete t;
t = NULL;
}
}
static int high(tree t)
{
if(t == NULL) return 0;
int lh = high(t->L);
int rh = high(t->R);
return 1+(lh>rh?lh:rh);
}
};
int main()
{
bst b;
b.insert('k');
b.insert('s');
b.insert('f');
b.insert('t');
b.insert('a');
b.insert('m');
b.insert('x');
b.insert('e');
b.travel();
b.remove('k');
b.travel();
b.update('x','*');
b.travel();
while(!b.empty())
b.remove(b.root());
cout << "size: " << b.size() << endl;
b.travel();
return 0;
}