利用包装器以及lambda表达式实现二叉查找树
2015-04-26 00:46
260 查看
#include<iostream>
#include<functional>
using namespace std;
template <class T>
class tree
{
private:
struct Node
{
T data;
Node* L;
Node* R;
Node(T d) :data(d), L(NULL), R(NULL){}
};
Node* root;
int Count;
public:
tree() :root(NULL), Count(0){}
tree& Insert(T d)
{
function<tree&(Node*&, T&)> ins = [&](Node*& r, T& dd)->tree&
{
if (r == NULL)
{
r = new Node(dd);
return *this;
}
else if (dd < r->data)
{
return ins(r->L, dd);
}
else
{
return ins(r->R, dd);
}
};
Count++;
return ins(root, d);
}
void Travel()
{
function<void(Node*&)> tra = [&](Node*& r)
{
if (r == NULL)
{
return;
}
tra(r->L);
cout << r->data << " ";
tra(r->R);
};
tra(root);
}
Node*& Find(T d)
{
function<Node*&(Node*&, T)> fid = [&](Node*& r, T dd)->Node*&
{
if (r == NULL)
{
return r;
}
else if (r->data == dd)
{
return r;
}
else if (r->data < dd)
{
return fid(r->R, dd);
}
else
{
return fid(r->L, dd);
}
};
return fid(root, d);
}
bool If_empty()
{
return root == NULL;
}
bool Remove(T d)
{
function<bool(Node*, T)> rem = [&](Node* r, T dd)
{
Node*& temp = Find(dd);
if (temp == NULL)
{
return false;
}
Node* p = temp;
if (temp->L)
{
//无论有没有右子树,都不用考虑
Node* pn = temp->R;
while (pn->L)
{
pn = pn->L;
}
pn->L = temp->L;
}
temp = temp->R;
delete p;
p = NULL;
return true;
};
return rem(root, d);
}
void updata(T d)
{
Insert(d);
}
void clear()
{
function<void(Node*&)> cls = [&](Node*& r)
{
if (r == NULL)
{
return;
}
cls(r->L);
cls(r->R);
delete r;
r = NULL;
};
cls(root);
}
int high()
{
function<int(Node*)> h = [&](Node* r)
{
if (r == NULL)
{
return 0;
}
int lh = h(r->L);
int rh = h(r->R);
return 1 + (lh > rh ? lh : rh);
};
return h(root);
}
};
int main()
{
tree<int> t;
t.Insert(5);
t.Insert(2);
t.Insert(1);
t.Insert(3);
t.Insert(6);
t.Insert(4);
t.Travel();
cout << endl;
t.Remove(2);
t.Travel();
cin.get();
return 0;
}
#include<functional>
using namespace std;
template <class T>
class tree
{
private:
struct Node
{
T data;
Node* L;
Node* R;
Node(T d) :data(d), L(NULL), R(NULL){}
};
Node* root;
int Count;
public:
tree() :root(NULL), Count(0){}
tree& Insert(T d)
{
function<tree&(Node*&, T&)> ins = [&](Node*& r, T& dd)->tree&
{
if (r == NULL)
{
r = new Node(dd);
return *this;
}
else if (dd < r->data)
{
return ins(r->L, dd);
}
else
{
return ins(r->R, dd);
}
};
Count++;
return ins(root, d);
}
void Travel()
{
function<void(Node*&)> tra = [&](Node*& r)
{
if (r == NULL)
{
return;
}
tra(r->L);
cout << r->data << " ";
tra(r->R);
};
tra(root);
}
Node*& Find(T d)
{
function<Node*&(Node*&, T)> fid = [&](Node*& r, T dd)->Node*&
{
if (r == NULL)
{
return r;
}
else if (r->data == dd)
{
return r;
}
else if (r->data < dd)
{
return fid(r->R, dd);
}
else
{
return fid(r->L, dd);
}
};
return fid(root, d);
}
bool If_empty()
{
return root == NULL;
}
bool Remove(T d)
{
function<bool(Node*, T)> rem = [&](Node* r, T dd)
{
Node*& temp = Find(dd);
if (temp == NULL)
{
return false;
}
Node* p = temp;
if (temp->L)
{
//无论有没有右子树,都不用考虑
Node* pn = temp->R;
while (pn->L)
{
pn = pn->L;
}
pn->L = temp->L;
}
temp = temp->R;
delete p;
p = NULL;
return true;
};
return rem(root, d);
}
void updata(T d)
{
Insert(d);
}
void clear()
{
function<void(Node*&)> cls = [&](Node*& r)
{
if (r == NULL)
{
return;
}
cls(r->L);
cls(r->R);
delete r;
r = NULL;
};
cls(root);
}
int high()
{
function<int(Node*)> h = [&](Node* r)
{
if (r == NULL)
{
return 0;
}
int lh = h(r->L);
int rh = h(r->R);
return 1 + (lh > rh ? lh : rh);
};
return h(root);
}
};
int main()
{
tree<int> t;
t.Insert(5);
t.Insert(2);
t.Insert(1);
t.Insert(3);
t.Insert(6);
t.Insert(4);
t.Travel();
cout << endl;
t.Remove(2);
t.Travel();
cin.get();
return 0;
}
相关文章推荐
- 一个简单的利用ini配置文件以及用户输入的交互进行文件夹内容拷贝的批处理文件脚本的实现
- 二分查找,二叉查找树(二叉排序树)的基本思想以及算法实现
- 利用Redis实现亿级别用户登录统计(活跃度以及登录次数统计)
- Flex中利用mx:Sequence标签实现顺序效果(Sequencing effects)以及划变效果(Wipe effects)的例子
- ASP小偷程序如何利用XMLHTTP实现表单的提交以及cookies或session的发送
- 利用RecycleView实现类似ListView的Item点击,长按等操作事件以及点击后每一项在添加一个列表
- 二叉树的创建以及利用迭代实现中序、先序、后序遍历、清空
- 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
- 利用js实现遮罩以及弹出可移动登录窗口
- 虚拟机利用Host-only实现在不插网线的情况下,虚拟机与主机实现双向通信,实现ssh连接以及samba服务实现共享
- unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
- 利用python的heapq实现prim算法以及优先级队列
- Spring-利用InitializingBean接口和zookeeper实现项目初始化缓存以及同步监听
- 如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题
- 二叉查找树的数据结构以及实现(JAVA)
- 利用泛解析实现二级域名原理以及程序
- 切换导航标签实现当前标签颜色改变以及利用js如何准确获取当前页面url网址信息
- Unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
- 利用Redis实现亿级别用户登录统计(活跃度以及登录次数统计)