先建立二叉树类的相关代码如下:
#include <iostream> #include <math.h> #include <stdlib.h> using namespace std; template <typename T> struct bintreenode { T date; bintreenode<T> *leftchild,*rightchild; bintreenode() { leftchild = NULL; rightchild = NULL; } bintreenode(T x, bintreenode<T> *l = NULL,bintreenode<T> *r = NULL) { date = x; leftchild = l; rightchild = r; } }; template <class T> class binarytree { private: bintreenode<T> *root;//根为非空节点,保存有数据 T refvalue;//标示空节点的字符 public: friend istream& operator >> (istream&, binarytree<T>&); friend ostream& operator << (ostream &out, binarytree<T> &tree) { out<<"二叉树前序遍历结果为:"<<endl; bintreenode<T> *p = tree.getroot(); tree.Traverse(p); out<< endl; return out; } binarytree() { root = NULL; } binarytree(T value) { refvalue = value; root = NULL; } binarytree(const binarytree<T> &s);//复制构造函数 bintreenode<T>* copy(bintreenode<T>*);//复制函数 ~binarytree(){destroy(root);}//析构函数 void destroy(bintreenode<T>*);//删除二叉树 bool IsEmpty(){return root == NULL ? true : false;}//判断是否为空树 void Createbintree(bintreenode<T>* &subtree);//创建二叉树 void Traverse(bintreenode<T>* subtree);//前序遍历 bintreenode<T>* getroot() const{ return root;}//取根节点 int size(bintreenode<T>* subtree)const;//计算节点个数 int height(bintreenode<T>* subtree)const;//求树的高度 int leaves(bintreenode<T>* subtree) const;//计算叶子节点个数 bintreenode<T>* parent(bintreenode<T>*, T);//求指定点的父节点 bintreenode<T>* find(bintreenode<T>* subtree,const T &t) const;//查找节点信息 bool equal(bintreenode<T>* t1,bintreenode<T>* t2)const;//判断两棵树是否相等 }; template<typename T> istream& operator >> (istream& in,binarytree<T>& tree) { bintreenode<T> *p = tree.getroot(); tree.Createbintree(p); return in; } /* template<typename T> ostream& operator<<(ostream& out, binarytree<T>& tree) { out<<"二叉树前序遍历结果为:"<<endl; bintreenode<T> *p = tree.getroot(); tree.Traverse(p); out<< endl; return out; } */ template<typename T> binarytree<T>::binarytree(const binarytree<T> &s) { root = copy(s.root); } template<typename T> bintreenode<T>* binarytree<T>::copy(bintreenode<T>* orignode) { if(orignode == NULL) return NULL; bintreenode<T>* temp = new bintreenode<T>; temp->date = orignode->date; temp->leftchild = copy(orignode->leftchild); temp->rightchild = copy(orignode->rightchild); return temp; } template<typename T> void binarytree<T>::destroy(bintreenode<T> * subtree) { if(subtree != NULL) { destroy(subtree->leftchild); destroy(subtree->rightchild); delete subtree; } } template<typename T> void binarytree<T>::Createbintree(bintreenode<T>* &subtree) { T item; if(!cin.eof()) { cin >> item; if(item != refvalue) { subtree = new bintreenode<T>(item); if(subtree == NULL) { cout << "储存分配出错!"<< endl; exit(1); } if(root == NULL) root = subtree; Createbintree(subtree->leftchild); Createbintree(subtree->rightchild); } else subtree == NULL; } } template<typename T> void binarytree<T>::Traverse(bintreenode<T>* subtree) { if(subtree != NULL) { cout << subtree->date << " "; Traverse(subtree->leftchild); Traverse(subtree->rightchild); } } template<typename T> int binarytree<T>::size(bintreenode<T>* subtree)const { if(subtree == NULL) return 0; else return 1 + size(subtree->leftchild) + size(subtree->rightchild); } template<typename T> int binarytree<T>::height(bintreenode<T>* subtree)const { int dep1,dep2; if(subtree == NULL) return 0; else { dep1 = height(subtree->leftchild); dep2 = height(subtree->rightchild); return dep1 > dep2 ? dep1+1 : dep2+1; } } template<typename T> int binarytree<T>::leaves(bintreenode<T> *subtree)const { if(subtree == NULL) return 0; else { if(subtree->leftchild == NULL && subtree->rightchild == NULL) return 1; else return leaves(subtree->leftchild) + leaves(subtree->rightchild); } } template<typename T> bintreenode<T>* binarytree<T>::parent(bintreenode<T>* subtree, T current) { if(subtree == NULL) return NULL; if((subtree->leftchild != NULL && subtree->leftchild->date == current) || (subtree->rightchild != NULL &&subtree->rightchild->date == current)) return subtree; bintreenode<T>* p; if((p = parent(subtree->leftchild,current)) != NULL) return p; else return parent(subtree->rightchild,current); } template<typename T> bintreenode<T>* binarytree<T>::find(bintreenode<T>* subtree,const T &x)const { if(subtree == NULL) return NULL; if(subtree->date == x) return subtree; bintreenode<T>* p; if((p = find(subtree->leftchild,x)) != NULL) return p; else return find(subtree->rightchild,x); } //先处理都为空的情况为相等 //再处理只有一个为空的情况 //最后处理两个都不是空的时候的情况,子树的的判断 template<typename T> bool binarytree<T>::equal(bintreenode<T>* t1, bintreenode<T>* t2)const { if(t1 == NULL && t2 == NULL) return true; else if(t1 == NULL || t2 == NULL) return false; else { if(t1->date == t2->date) return true; bool l_equal = equal(t1->leftchild,t2->leftchild); bool r_equal = equal(t1->rightchild,t2->rightchild); if(l_equal && r_equal) return true; else return false; } }
再建立一个主文件如下:
#include <iostream> #include "tree.h" using namespace std; int main() { binarytree<char> P('#'); binarytree<char> P1(P); cout << "请按照前序遍历输入:"<< endl; bintreenode<char>* Q = P.getroot(); P.Createbintree(Q); cout << "前序遍历为:"<< endl; P.Traverse(Q); cout << endl <<"节点个数为:"; cout << P.size(Q) << endl; cout << "树高度为:" << P.height(Q) << endl; cout << "树种叶子数为:" << P.leaves(Q)<< endl; /* cout << "节点F的父节点为:"; bintreenode<char> *node = P.parent(Q,'A'); if(node != NULL) cout << node->date; else cout <<"不存在父节点!"; cout << "查找信息为:" << P.find(Q,'G')->date << endl; */ if(P.equal(Q,Q)) cout << "xiangdeng"<<endl; else cout<<"bd"<< endl; return 0; }
在编码的过程中最容易出问题的是:查找指定元素的位置和父节点,还有两个二叉树是否相等的判断,在这三个函数中要用到递归的思想,在判断到找出准确位置时可以中断递归。但处理的过程不同,最主要还是要由清晰的思路和递归的思想。