一、实验目的
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; }
转载请标明出处:实验五:树与二叉树的实验二
文章来源: 实验五:树与二叉树的实验二