〃二叉树类template <class T> class Binary Tree {public:BinaryNode<T> *root;〃构造空二叉树//以标明空子树的先根序列构造一棵二叉树〃以先根和中根序列构造二叉树 〃析构函数〃判断是否空二叉树 〃先根次序遍历二叉树 //中根次序遍历二叉树//后根次序遍历二叉树 〃返冋二叉树的结点个数int height();〃返回二叉BinaryNode<T>* search(T value);//查找首次BinaryNode<T>* getParent(BinaryNode<T>*node); 〃返回 node 结点的父母结点BinaryNode<T>* insert(BinaryNode<T> *p, T value, bool leftChild=true); 〃插入 value 作为 p结点的孩子void remove(BinaryNode<T> *p, bool leftChild=true); 〃删除 p 结点的左或右子树BinaryNode<T>* create(T prelist[], int n, int &i); 〃以标明空子树的先根遍历序列创建子#include "BinaryNode.h" #include "SeqStack.h” #include "LinkedStack.h u #include "SeqQueue.h" //#include "LinkedQueue.h"〃二叉树的二叉链表结点类 //顺序栈 〃链式栈 〃顺序循环队列 〃链式队列〃二叉树类〃指向根结点BinaryTree();BinaryTree(T prelist[], int n);BinaryTree(T prelist[], T inlistf], int n); 〜BinaryTree(); bool isEmptyO; void preOrder(); void inOrder(); void postOrder(); int count();void printGList(); void inOrderTraverse(); void levelOrder(); private:void preOrder(BinaryNode<T> *p); void inOrder(BinaryNode<T> *p); void postOrder(BinaryNode<T> *p); void destroy(BinaryNode<T> *p);〃以广义表表示输出二叉树〃中根次序遍历二叉树的非递归算法 〃按层次遍历二叉树〃先根次序遍历以P 结点为根的子树 〃屮根次序遍历以P 结点为根的子树 〃后根次序遍历以P 结点为根的子树 〃撤销二叉树BinaryNode<T>* create(T prelistf], T inlistf], int preStart, int inStart, int n); 〃以先根和屮 根序列创建一棵子树int count(BinaryNode<T> *p); 〃返冋以p 结点为根的子树结点个数 int height(BinaryNode<T> *p);//返冋以p 结点为根的子树高度BinaryNode<T>* search(BinaryNode<T> *p, T value); 〃在以 p 为根的子树屮查找首次出 现的值为value 的结点BinaryNode<T>* getParent(BinaryNode<T> BinaryNode<T> *node);void replaceAll(BinaryNode<T> *p, T old, T value); 〃在以 p 为根的子树中实现全部 替换 bool equals(BinaryNode<T> *p, BinaryNode<T> *q);〃判断以 p 和 q 结点为根的两棵子树是否相等BinaryNode<T>* copy(BinaryNode<T> *p);〃第8章习题bool isSorted(BinaryNode<T>* p);void printGList(BinaryNode<T> *p); 树〃第6章习题public: void leaf(); int countLeaf();bool replace(T old, T value); valuevoid replaceAll(T old, T value); int operator==(BinaryTree<T> &bitree); BinaryTree(BinaryTree<T> &bitree); void preOrderTraverse(); bool isSorted();〃以广义表表示输出以p 结点为根的子〃遍历输出叶子结点 〃返回二叉树的叶子结点数〃将首次岀现的值为old 结点值替换为〃将值为old 的结点全部替换为value //比较两棵二叉树是否相等,重载运算符 〃由已知的bitree 构造二叉树 〃先根次序遍历二叉树的非递归算法 〃判断一棵二叉树是否为二叉排序树 private:void leaf(BinaryNode<T> *p); 结点 int countLeaf(BinaryNode<T> *p);个数〃输出以p 结点为根的子树的所有叶子 〃返回以p 结点为根的子树的叶子结点〃复制以p 根的子二叉树template <class T>B in aryTree<T>::BinaryTree()〃构造空二叉树root = NULL;template <class T>bool BinaryTree<T>::isEmptyO { return root==NULL;}〃3・二叉树的先根、中根和后根次序遍历算法template <class T>void BinaryTree<T>::preOrder(){cout«,*先根次序遍历二叉树:”;preOrder(root); 数cout«endl;}template <class T>void BinaryTree<T>::preOrder(BinaryNode<T> *p) 归函数{if(p!=NULL){cout«p->data«H preOrder(p->Ieft);递归调用preOrder(p->right);递归调用}1template <class T>void BinaryTree<T>::inOrder(){cout«"中根次序遍历二叉树:”;inOrder(root); 数cout«endl;}template <class T>void BinaryTree<T>::inOrder(BinaryNode<T> *p)归函数if(p!=NULL){〃判断是否空二叉树〃先根次序遍历二叉树〃调用先根次序遍历二叉树的递归函〃先根次序遍历以p结点为根的子树,递〃若二叉树不空〃访问当前结点〃按先根次序遍历当前结点的左子树,〃按先根次序遍历当前结点的右子树,〃中根次序遍历二叉树〃调用中根次序遍历二叉树的递归函〃中根次序遍历以p结点为根的子树,递inOrder(p->left); cout«p->data«H inOrder(p->right);template <class T>void BinaryTree<T>::postOrder() //后根次序遍历二叉树{cout«,*后根次序遍历二叉树:”;postOrder(root); 〃调用后根次序遍历二叉树的递归函数cout«endl;}template <class T>void BinaryTree<T>::postOrder(BinaryNode<T> *p) 〃后根次序遍历以p 结点为根的子树,递归函数{if (p!二NULL){postOrder(p->left);postOrder(p->right);cout«p->data«"}}//4.基于遍历的操作template <class T>B inaiyTree<T> ~ B inaryTree() 〃析构函数{cout«n撤销二叉树:”;destroy(root);cout«endl;} template <class T>void BinaryTree<T>::destroy(BinaryNode<T> *p) 〃撤销以p 结点为根的子树,后根次序遍历讦(p!=NULL){destroy(p->left); destroy(p->right);cout«p->data«'r 〃显示撤销结点的次序 delete p; } }//【例6.1】构造并遍历二叉树。
template <class T> int BinaryTree<T>::count() 〃返回二叉树的结点个数{return count(root); }template <class T>int BinaryTree<T>::count(BinaryNode<T> *p) 〃返冋以p 结点为根的子树结点个数 {if (p==NULL) return 0; elsereturn I +count(p->left)+count(p->right);}template <class T> int BinaryTree<T>::height() {return height(root); }template <class T>int BinaryTree<T>::height(BinaryNode<T> *p) 序遍历{if(p!=NULL) {int lh = height(p->left); int rh = height(p ・>right); return (lh>=rh) ? lh+1 : rh+1; }return 0;〃返回二叉树的高度〃返回以p 结点为根的子树高度,后根次 〃求左子树的高度template <class T>BinaiyNode<T>* BinaiyTree<T>::search(T value)〃查找首次出现的值为 value 结点{return search(root, value);template <class T>BinaryNode<T>* BinaryTree<T>::search(BinaryNode<T> 水p, T value) 〃在以 p 为根的子树中 查找{〃先根次序遍历查找值为value 的结点,返回首次出现结点指针,若未找到返回NULLtemplate <class T>BinaryNode<T>* BinaryTree<T>::getParent(BinaryNode<T> *node) 〃返冋 node 结点的父母 结点指针 { 〃若空树、未找到或node 为根,返回 NULLif (root==NULL || node==NULL || node==root)return NULL; retum getParent(root, node);template <class T>BinaryNode<T>* BinaryTree<T>::getParent(BinaryNode<T>BinaryNode<T> *node){〃在以p 为根的子树中查找并返回node 结点的父母结点指针BinaryNode<T> *find=NULL; if(p!=NULL){if (p->left==node || p->right==node)return p;find = getParent(p->left, node); if (find 二二NULL)BinaryNode<T> *find 二NULL; if (p!二NULL){if (p->data==value)retum p; find = search(p->left, value);归调用if (find==NULL)find = search(p ・>right,value); }return find;〃记载找到结点〃查找成功,返回结点指针〃在左子树中查找,find 指向找到结点,递〃若在左子树中未找到〃则继续在右子树屮查找,递归调用〃返回查找结果find = getParent(p->right, node);}return find;}//5.构造二叉树template <class T>BinaryTree<T>::BinaryTree(T prelistf], T inlistf], int n) 〃以先根和中根序列构造二叉树//n指定序列长度root = create(prelist, inlist, 0, 0, n);}template <class T>BinaryNode<T>* BinaryTree<T>::create(T prelist[], T inlist[], int preStart,int inStart, int n) 〃以先根和中根序列创建一棵子树,子树根结点是prelist[i],返回根结点指针BinaryNode<T> *p=NULL;讦(n>0)return p;template <class T>BinaryTree<T>::BinaryTree(T prelist[], int n) 〃以标明空子树的先根序列构造二叉树{int i=();root=create(prelist, n, i);}template <class T>BinaryNode<T>* BinaryTree<T>::create(T prelistf], int n, int &i){ 〃以标明空子树的先根次序遍历序列创建一棵子树,子树根结点是prelist[i],返回根结点指针BinaryNode<T> *p=NULL;p = new BinaryNode<T>(elem); p->left = create(prelist, n, i); p->right = create(prelist, n, i); } } return p;//【例6.2] 输出二叉树中指定结点的所有祖先结点。