| template <class T> struct BTNode { BTNode(T data = T(), BTNode<T>* left = NULL, BTNode<T>* right = NULL, BTNode<T>* parent = NULL) : data(data), left(left), right(right), parent(parent) {} BTNode<T> *left, *right, *parent; T data; }; |
| template <class T> class BTree { public: BTree(BTNode<T> *root = NULL) : root(root) {} ~BTree() { MakeEmpty(); } void MakeEmpty() { destroy(root); root = NULL; } protected: BTNode<T> *root; private: void destroy(BTNode<T>* p) { if (p) { destroy(p->left); destroy(p->right); delete p; } } } |
| public: void PreOrder(void (*visit)(T &data) = print) { PreOrder(root, visit); } private: void PreOrder(BTNode<T>* p, void (*visit)(T &data)) { if (p){ visit(p->data); PreOrder(p->left, visit); PreOrder(p->right, visit); } } |
| public: void InOrder(void (*visit)(T &data) = print) { InOrder(root, visit); } private: void InOrder(BTNode<T>* p, void (*visit)(T &data)) { if (p){ InOrder(p->left, visit); visit(p->data); InOrder(p->right, visit); } } |
| public: void PostOrder(void (*visit)(T &data) = print) { PostOrder(root, visit); } private: void PostOrder(BTNode<T>* p, void (*visit)(T &data)) { if (p){ PostOrder(p->left, visit); PostOrder(p->right, visit); visit(p->data); } } |
| void LevelOrder(void (*visit)(T &data) = print) { queue< BTNode<T>* > a; BTNode<T>* p = root;//记得#include<queue> while (p) { visit(p->data); if (p->left) a.push(p->left); if (p->right) a.push(p->right); if (a.empty()) break; p = a.front(); a.pop(); } } 附注:缺省的visit函数print如下 private: static void print(T &data) { cout << data << ' ';} |
| public: BTNode<T>* next() { if(!current) return NULL; if (current->right) { current = current->right; while (current->left) current = current->left; } else { BTNode<T>* y = current->parent; while (y && current == y->right) {current = y; y = y->parent; } current = y; } return current; } private: BTNode<T>* current; |
| public: void first() { current = root; while (current->left) current = current->left; } |