bin tree

256 篇文章 3 订阅
149 篇文章 2 订阅
#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值