#include <iostream> using namespace std; template<class T> class binary_tree; template<class T> class node{ public: node():left(0),right(0),parent(0){} node(T& element):data(element),left(0),right(0),parent(0){} friend class binary_tree<T>; private: node* left; node* right; node* parent; T data; }; template<class T> class binary_tree { public: binary_tree():_size(0),root(NULL){} binary_tree(T* array, int length); ~binary_tree(); public: int size(){return _size;} bool insert(T&); node<T>* del(node<T>*); void inorder_walk(node<T>*,ostream&); void preorder_walk(node<T>*,ostream&); void postorder_walk(node<T>*,ostream&); node<T>* search(node<T>*,T&); node<T>* find(T& element); node<T>* successor(node<T>*); node<T>* minimum(node<T>*); node<T>* maximum(node<T>*); friend ostream& operator<<(ostream& out, binary_tree<T>& b_tree) //必须定义在类的内部才能调用 { b_tree.postorder_walk(b_tree.root,out); return out; } private: node<T>* root; int _size; }; template<class T> binary_tree<T>::~binary_tree() { } //插入元素,非递归方式 template<class T> bool binary_tree<T>::insert(T& element) { if (root == NULL) { root = new node<T>(); root->data = element; ++_size; return true; } node<T>* p = new node<T>(); node<T>* q = new node<T>(); p = root; while (p) { q= p; if (element == p->data) { return false; } else if (element < p->data) { p = p->left; } else { p = p->right; } } delete p; p = new node<T>(); p->data = element; p->parent = q; if (element < q->data) { q->left = p; } else { q->right = p; } ++_size; return true; } //前序遍历:根-左-右 template<class T> void binary_tree<T>::preorder_walk(node<T>* p,ostream& out) { if (p != NULL) { out<<p->data<<endl; preorder_walk(p->left,out); preorder_walk(p->right,out); } } //中序遍历:左-根-右 template<class T> void binary_tree<T>::inorder_walk(node<T>* p, ostream& out) { if (p != NULL) { inorder_walk(p->left,out); out<<p->data<<endl; inorder_walk(p->right,out); } } //后序遍历:左-右-根 template<class T> void binary_tree<T>::postorder_walk(node<T>* p,ostream& out) { if (p != NULL) { postorder_walk(p->left,out); postorder_walk(p->right,out); out<<p->data<<endl; } } //找以当前节点为根节点的子树的最小节点 template<class T> node<T>* binary_tree<T>::minimum(node<T> *p) { node<T>* q = new node<T>(); q = p; while (q->left != NULL) { q = q->left; } return q; } //找以当前节点为根节点的子树的最大节点 template<class T> node<T>* binary_tree<T>::maximum(node<T>* p) { node<T>* q = new node<T>(); q = p; while (q->right != NULL) { q = q->right; } return q; } //查找 template<class T> node<T>* binary_tree<T>::search(node<T>* p, T& element) { if (p == NULL || element == p->data) { return p; } else { if (element < p->data) { return search(p->left,element); } else { return search(p->right,element); } } } //查找某一个元素是否在树中:ok template<class T> node<T>* binary_tree<T>::find(T& element) { return search(root,element); } //找树中大于当前节点的最小的节点:ok template<class T> node<T>* binary_tree<T>::successor(node<T>* p) { if (p->right != NULL) //右支树不为空,大于当前节点最小值为右支树的最小值 { return minimum(p->right); } node<T>* q = p->parent; //当前节点无右子树,找左支树中包含当前节点的最近的最先节点 while(q != NULL && q->right == p) { p = q; q = q->parent; } return q; } //删除 template<class T> node<T>* binary_tree<T>::del(node<T>* p) { node<T>* x; node<T>* q; if (p->left == NULL || p->right == NULL) //p只有左子树或只有右子树,删除后直接将p的子树与其父节点斜街即可 { q = p; } else //否则找大于待删除节点的最小值,将待删除元素的子树衔接到该节点的父母节点上(该节点最多只有一个子节点),之后将该节点的值复制到要删除的节点中即可完成删除操作 { q = successor(p); } if(q->left != NULL) { x = q->left; } else { x = q->right; } if (x != NULL) { x->parent = q->parent; } if (q->parent == NULL) { root = x; } else if (q == q->parent->left) //左子树 { q->parent->left = x; } else { q->parent->right = x; } if (q != p) { p->data = q->data; //替换值 } --_size; return q; }