hanyujianke 2020-07-04
数据结构的练习与巩固 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include<iostream> using namespace std; template <class T> struct BTNode { //二叉树结点类定义 T data; //数据域 BTNode<T> *lChild, *rChild; //左子女、右子女链域 BTNode () //构造函数 { lChild = NULL; rChild = NULL; } BTNode (T& x, BTNode<T> *l = NULL, BTNode<T> *r = NULL) { data = x; lChild = l; rChild = r; } }; //二叉树类定义 template <class T> class BT { public: BTNode<T> *root; //二叉树的根指针 T RefValue; //数据输入停止标志 public: BT () : root (NULL) {} //构造函数 BT (T value) : RefValue(value), root(NULL) {} //构造函数 BTNode<T> *lChild (BTNode<T> *t) { return (t != NULL)?t->lChild : NULL; } //返回左子女 BTNode<T> *rChild (BTNode<T> *t) { return (t != NULL)?t->rChild : NULL; } //返回右子女 bool IsEmpty() { return root == NULL; } //判二叉树空否 BTNode<T> * & getRoot () { return root; } //取根 void PreOrder (BTNode<T>*& subTree); //前序遍历 void InOrder (BTNode<T>*& subTree); //中序遍历 void postOrder(BTNode<T>*& subTree); //后序遍历 void CreateBT(BTNode<T>* & subTree); 52 void Size (BTNode<T> * &subTree,int &count); //返回结点数 void leaf (BTNode<T> * &subTree,int &count); //返回叶子数 }; template<class T> void BT<T>::PreOrder(BTNode<T>* &subTree) { if (subTree != NULL) { cout << subTree->data <<‘ ‘; PreOrder(subTree->lChild); PreOrder(subTree->rChild); } } template<class T> void BT<T>::InOrder(BTNode<T>* &subTree) { if (subTree != NULL) { InOrder(subTree->lChild); cout << subTree->data <<‘ ‘; InOrder(subTree->rChild); } } template<class T> void BT<T>::postOrder(BTNode<T>*& subTree) { if (subTree != NULL) { postOrder(subTree->lChild); postOrder(subTree->rChild); cout << subTree->data <<‘ ‘; } } //前序创建二叉树 template<class T> void BT<T>::CreateBT(BTNode<T>*&subTree) //注意用引用接收指针 如果只传入指针 形参的指针指向改变 实参不会变 { T ch; cin >> ch; if (ch == RefValue) subTree = NULL; else { subTree = new BTNode<T>(ch); //有参构造函数 建立结点 CreateBT(subTree->lChild); //递归 CreateBT(subTree->rChild); } } template<class T> void BT<T>::Size (BTNode<T> * &subTree,int &count) { if (subTree != NULL) { count++; Size(subTree->lChild,count); Size(subTree->rChild,count); } else return; } template<class T> void BT<T>::leaf (BTNode<T> * &subTree,int &count) { if(subTree!=NULL) { if(subTree->lChild==NULL && subTree->rChild==NULL) { count++; return; } else { leaf(subTree->lChild,count); leaf(subTree->rChild,count); } } } int main() { int c1=0,c2=0; BT<char> t(‘#‘); t.CreateBT(t.getRoot()); cout<<"前序遍历"<<endl; t.PreOrder(t.getRoot()); cout<<endl<<"中序遍历"<<endl; t.InOrder(t.getRoot()); cout<<endl<<"后序遍历"<<endl; t.postOrder(t.getRoot()); t.Size(t.getRoot(),c1); cout<<endl<<"结点总个数:"<<c1<<endl; t.leaf(t.getRoot(),c2); cout<<"叶子结点总个数:"<<c2<<endl; }