实验五:树与二叉树的实验二

匿名 (未验证) 提交于 2019-12-03 00:37:01

一、实验目的

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; }





标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!