利用二叉链表的二叉树类的定义
#include <iostream> //二叉树结点类的定义 template <class T> struct BinTreeNode { T data; //数据域 BinTreeNode *leftChild, *rightChild; //左右子女指针 BinTreeNode():leftChild(NULL), rightChild(NULL) {} BinTreeNode(T x, BinTreeNode<T> *l = NULL, BinTreeNode<T> *r = NULL) :data(x), leftChild(l), rightChild(r) {} }; template <class T> class BinaryTree { public: BinaryTree(); //构造函数 BinaryTree(T value); //构造函数 BinaryTree(BinaryTree<T>& s); //复制构造函数 ~BinaryTree(); //析构函数 bool IsEmpty(); //判断二叉树是否为空 BinTreeNode<T> *Parent(BinTreeNode<T> *current); //返回父结点 BinTreeNode<T> *LeftChild(BinTreeNode<T> *current); //返回左子女 BinTreeNode<T> *RightChild(BinTreeNode<T> *current); //返回右子女 int Height(); //返回树的高度 int Size(); //返回结点数 BinTreeNode<T> *getRoot()const; //取根 void preOrder(void(*visit)(BinTreeNode<T> *p)); //前序遍历 void inOrder(void(*visit)(BinTreeNode<T> *p)); //中序遍历 void postOrder(void(*visit)(BinTreeNode<T> *p)); //后序遍历 void levelOrder(void(*visit)(BinTreeNode<T> *p)); //层次遍历 int Insert(const T& item); //插入新元素 BinTreeNode<T> *Find(T& item)const; //搜索 protected: BinaryTree<T> *root; //二叉树的根指针 T RefValue; //数据输入停止标志 void CreateBinTree(istream& in, BinTreeNode<T> *& subTree); //从文件读入建树 bool Insert(BinTreeNode<T> *& subTree, const T& x); //插入 bool destroy(BinTreeNode<T> *& subTree); //删除 bool Find(BinTreeNode<T> *subTree, const T& x)const; //搜索 BinTreeNode<T> *Copy(BinTreeNode<T> *orignode); //复制 int Height(BinTreeNode<T> *subTree); //返回树高度 int Size(BinTreeNode<T> *subTree); //返回结点数 BinTreeNode<T> *Parent(BinTreeNode<T> *subTree, BinTreeNode<T> *current); //返回父结点 BinTreeNode<T> *Find(BinTreeNode<T> *subTree, const T& x)const; //搜寻x void Traverse(BinTreeNode<T> *subTree, ostream& out); //前序遍历输出 void preOrder(BinTreeNode<T>& subTree, void(*visit)(BinTreeNode<T> *p)); //前序遍历 void inOrder(BinTreeNode<T>& subTree, void(*visit)(BinTreeNode<T> *p)); //中序遍历 void postOrder(BinTreeNode<T>& subTree, void(*visit)(BinTreeNode<T> *p)); //后序遍历 friend istream& operator >> (istream& in, BinaryTree<T>& Tree); //重载操作:输入 friend ostream& operator << (ostream out, BinaryTree<T>& Tree); //重载操作:输出 };
部分成员函数的实现
删除destroy
template <class T> BinaryTree<T>::destroy(BinTreeNode<T> *subTree) { if (subTree != NULL) { destroy(subTree->leftChild); //递归地删除左子树 destroy(subTree->rightChild); //递归地删除右子树 delete subTree; //递归subTreee } };
找父结点
template <class T> BinTreeNode<T> *BinaryTree<T>::Parent(BinTreeNode<T> *subTree, BinTreeNode<T> *current) { if (subTree == NULL) return NULL; if (subTree->leftChild == current || subTree->rightChild == current) return subTree; //找到,返回父结点 BinTreeNode<T> *p; if ((p = Parent(subTree->leftChild, current)) != NULL) return p; //递归在左子树中搜索 else return Parent(subTree->rightChild, current); //递归在右子树中搜索 }
搜索并输出根为subTree的二叉树
template <class T> void BinaryTree<T>::Traverse(BinTreeNode<T> *subTree, ostream& out) { if (subTree != NULL) { out << subTree->data << ' '; Traverse(subTree->leftChild, out); Traverse(subTree->rightChild, out); } }
输入广义表建立二叉树
template <class T> void BinaryTree<T>::CreateBinTree(istream& in, BinTreeNode<char> *& BT) { Stack<BinTreeNode<char>*> s; BT = NULL; BinTreeNode<char> *p, *t; int k; char ch; in >> ch; while (ch != RefValue) { switch (ch) { case '(':s.Push(p); k = 1; break; case ')':s.Pop(t); break; case ',':k = 2; break; default: p = new BinTreeNode(ch); if (BT == NULL) BT = p; else if (k == 1) { s.getTop(t); t->leftChild = p; } else { s.getTop(); t->rightChild = p; } } in >> ch; } }