binary_tree.h
声明
#ifndef BINARY_TREE
#define BINARY_TREE
#include "util.h"
template<typename T>
class tree_node {
public:
tree_node(T key_):key(key_), parent(NULL), left_child(NULL), right_child(NULL) {};
T get_key();
tree_node* get_parent();
tree_node* get_left_child();
tree_node* get_right_child();
void set_parent(tree_node* p);
void set_left_child(tree_node* lc);
void set_right_child(tree_node* rc);
private:
T key;
tree_node* parent;
tree_node* left_child;
tree_node* right_child;
};
template<typename T>
class binary_tree {
public:
binary_tree():root(NULL), size(0), max_key_length(0), change(false) {};
void inorder_tree_walk(tree_node<T>* r) const; //输出中序遍历
void preorder_tree_walk(tree_node<T>* r) const; //输出前序遍历
void postorder_tree_walk(tree_node<T>* r) const; //输出后序遍历
tree_node<T>* search(tree_node<T>* x, T k) const; //查找键值为k的结点
tree_node<T>* min_node(tree_node<T>* x) const; //返回键值最小的结点
tree_node<T>* max_node(tree_node<T>* x) const; //返回键值最大的结点
tree_node<T>* successor_node(tree_node<T>* x) const; //返回下一个结点,即最小的比当前结点键值大的结点
tree_node<T>* get_root() const; //获取根节点
void tree_insert(tree_node<T>* z); // 插入结点
void tree_delete(tree_node<T>* z); // 删除结点
void print_tree(); // 按树状打印二叉树
int tree_size() const; // 结点个数
int tree_height(tree_node<T>* r) const; //树高
private:
void transplant(tree_node<T>* u, tree_node<T>* v); //用v为根的子树替换u为根的子树
void find_nodes_indexes(tree_node<T>* r, int layer); //计算每个结点的横纵坐标,用于树形打印
int get_max_key_length() const; //获取键的最大长度,用于打印
int size; //节点个数
int max_key_length; //键的最大长度
tree_node<T>* root; //根结点指针
map<tree_node<T>*, pair<int, int> > nodes_indexes; //结点指针与其横纵坐标的对应
bool change; //与上次树形打印时相比,二叉树是否发生了变化
};
实现
/*=================实现=====================*/
/*****tree_node*****/
template<typename T>
T tree_node<T>::get_key() {
return key;
}
template<typename T>
tree_node<T>* tree_node<T>::get_p