#include <iostream>
#include <new>
using namespace std;
template <class T>
struct bin_tree_node {
bin_tree_node() {
lchild = nullptr;
rchild = nullptr;
}
bin_tree_node(const T &a, bin_tree_node *b = nullptr, bin_tree_node *c = nullptr) : data(a), lchild(b), rchild(c) {
}
T data;
struct bin_tree_node *lchild;
struct bin_tree_node *rchild;
};
template <class T>
class bin_tree {
public:
bin_tree() {
root_ = nullptr;
}
~bin_tree() {
destory(root_);
}
void create() {
create(root_);
}
void pre_order_show() {
pre_order_show(root_);
}
template <class FunType, typename...Args>
void pre_order_transfer(FunType &fun, Args...args) {
pre_order_transfer(root_, fun, args...);
}
private:
void create(bin_tree_node<T>*&ptr) {
T data;
cout << "data = ";
cin >> data;
if ('#' == data) {
ptr = nullptr;
return;
}
ptr = new(nothrow) bin_tree_node<T>(data);
if (!ptr) {
return;
}
create(ptr->lchild);
create(ptr->rchild);
}
void pre_order_show(bin_tree_node<T>*ptr) {
if (nullptr != ptr) {
cout << ptr->data << endl;
pre_order_show(ptr->lchild);
pre_order_show(ptr->rchild);
}
}
template <class FunType, typename...Args>
void pre_order_transfer(bin_tree_node<T>*ptr, FunType &fun, Args...args) {
if (nullptr != ptr) {
fun(ptr->data, args...);
pre_order_transfer(ptr->lchild, fun, args...);
pre_order_transfer(ptr->rchild, fun, args...);
}
}
void destory(bin_tree_node<T>*&ptr) {
if (nullptr == ptr) {
return;
}
destory(ptr->lchild);
destory(ptr->rchild);
delete ptr;
ptr = nullptr;
}
private:
bin_tree_node<T>*root_;
};
void show(char ch, int index) {
static int s_index = index;
cout << "index = " << s_index++ << " " << ch << endl;
}
int main() {
bin_tree<char>bin_tree0;
bin_tree0.create();
// bin_tree0.pre_order_show();
bin_tree0.pre_order_transfer(show, 1);
return 0;
}