實驗五:樹與二叉樹的實驗二
阿新 • • 發佈:2018-11-08
一、實驗目的
1、 熟練理解樹和二叉樹的相關概念,掌握的儲存結構和相關操作實現;
2、 掌握樹的順序結構的實現;
3、 學會運用樹的知識解決實際問題
二、實驗內容
1、自己確定一個二叉樹(樹結點型別、數目和結構自定)利用鏈式儲存結構方法儲存。實
現樹的構造,並完成:
1) 用前序遍歷、中序遍歷、後序遍歷輸出結點資料;
2) 以合理的格式,輸出各個結點和雙親、孩子結點資訊;
3)輸出所有葉子的資訊。
原始碼如下:
#include <iostream> using namespace std; template <class T> struct BiNode { T data; BiNode<T> *lchild; BiNode<T> *rchild; }; template <class T> class BiTree { private: BiNode<T> *root;//指向頭結點的頭指標 BiNode<T> *Creat(BiNode<T> *bt);//呼叫建構函式 void Release(BiNode<T> *bt);//呼叫解構函式 void PreOrder(BiNode<T> *bt);//呼叫前序遍歷 void InOrder(BiNode<T> *bt);//呼叫中序遍歷 void PostOrder(BiNode<T> *bt);//呼叫後序遍歷 void FindChild(BiNode<T> *bt);//查詢孩子 void FindParent(BiNode<T> *bt);//查詢雙親 void FindLeaf(BiNode<T> *bt);//查詢葉子 public: BiTree() { root = Creat(root); }//建構函式 ~BiTree() { Release(root); }//解構函式 void PreOrder(){PreOrder(root);}//前序遍歷 void InOrder(){InOrder(root);}//中序遍歷 void PostOrder() { PostOrder(root); }//後序遍歷 void FindChild(){FindChild(root);}//查詢孩子 void FindParent(){FindParent(root);}//查詢雙親 void FindLeaf(){FindLeaf(root);}//查詢葉子 }; template <class T> BiNode<T> * BiTree<T>::Creat(BiNode<T> *bt)//建構函式 { T ch; cin >> ch; if (ch == '#') bt = NULL; else { bt =new BiNode<T>; bt->data = ch; bt->lchild = Creat(bt->lchild); bt->rchild = Creat(bt->rchild); } return bt; } template <class T> void BiTree<T>::Release(BiNode<T> *bt) //解構函式 { if (bt != NULL) { Release(bt->lchild); Release(bt->rchild); delete(bt); } } template <class T> void BiTree<T>::PreOrder(BiNode<T> *bt)//前序遍歷 { if (bt != NULL) { cout << bt->data << ' '; PreOrder(bt->lchild); PreOrder(bt->rchild); } } template <class T> void BiTree<T>::InOrder(BiNode<T> *bt) //中序遍歷 { if (bt != NULL) { InOrder(bt->lchild); cout << bt->data << ' '; InOrder(bt->rchild); } } template <class T> void BiTree<T>::PostOrder(BiNode<T> *bt)//後序遍歷 { if (bt != NULL) { PostOrder(bt->lchild); PostOrder(bt->rchild); cout << bt->data << ' '; } } template <class T> void BiTree<T>::FindChild(BiNode<T> *bt)//查詢孩子 { if (bt != NULL) { if (bt->lchild!=NULL) cout << bt->data <<"左孩子"<<bt->lchild->data<<endl; else cout << bt->data <<"無左孩子"<<endl; if (bt->rchild!=NULL) cout << bt->data<<"右孩子"<<bt->rchild->data<<endl; else cout << bt->data <<"無右孩子"<<endl; FindChild(bt->lchild); FindChild(bt->rchild); } } template <class T> void BiTree<T>::FindParent(BiNode<T> *bt)//查詢雙親 { if (bt != NULL) { if (bt==root) cout<<bt->data<<"為根結點"<<endl; if (bt->lchild!=NULL) cout <<bt->lchild->data<<"雙親為"<< bt->data <<endl; if (bt->rchild!=NULL) cout <<bt->rchild->data <<"雙親為"<<bt->data<<endl; FindParent(bt->lchild); FindParent(bt->rchild); } } template <class T> void BiTree<T>::FindLeaf(BiNode<T> *bt)//查詢葉子 { if (bt != NULL) { if (bt->lchild==NULL&&bt->rchild==NULL) cout<< bt->data <<' '; FindLeaf(bt->lchild); FindLeaf(bt->rchild); } } int main() { cout<<"請輸入二叉樹:"<<endl; BiTree<char> B; cout<<"前序遍歷:"<<endl; B.PreOrder(); cout << endl; cout<<"中序遍歷:"<<endl; B.InOrder(); cout << endl; cout<<"後序遍歷:"<<endl; B.PostOrder(); cout << endl; cout<<"找孩子結點:"<<endl; B.FindChild(); cout << endl; cout<<"找雙親結點:"<<endl; B.FindParent(); cout << endl; cout<<"找葉子結點:"<<endl; B.FindLeaf(); cout << endl; return 0; }