实验6:树和二叉树的实验2

一、实验目的

1、熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现;

2、掌握树的顺序结构的实现;

3、 学会运用树的知识解决实际问题

 

二、实验内容

1、自己确定一个二叉树(树结点类型、数目和结构自定)利用链式存储结构方法存储。实现树的构造,并完成:

1) 用前序遍历、中序遍历、后序遍历输出结点数据;

2) 以合理的格式,输出各个结点和双亲、孩子结点信息;

3)输出所有的叶子结点信息;

 

2、试设计一个程序,将输入的字符串转化为对应的哈夫曼编码,然后再将这个哈夫曼编码序列进行解码,也就是恢复原来的字符串序列。(*)

三、实验步骤

1、依据实验内容,先确定具体的二叉树,并说明结点的数据类型;

2、设计具体的算法;

3、写出完整程序;

4、总结、运行结果和分析算法效率。

5、总体收获和不足,疑问等。

 

四、实验要求

1、按照数据结构实验任务书,提前做好实验预习与准备工作。

2、在个人主页上发文章提交作业。

3、 实验课会抽查3-5人,希望你可以被查到!


#ifndef bitree_H
#define bitree_H
const int MaxSize=10;
struct binode
{
	char data;
	binode *l,*r;
};
class Bitree
{
public:
	Bitree(){root=creat(root);} 
	~Bitree(){release(root);}
	void preorder(){preorder(root);}
	void inorder(){inorder(root);}
	void postorder(){postorder(root);}
	void print(){print(root,NULL);}						//输出 双亲、孩子信息
	void printleaf(){printleaf(root);}			//输出叶子信息
	void count(){count(root);}						//统计结点数
private:
	char data[MaxSize];
	int length;
	binode *root;
	binode *creat(binode *bt);
	void release(binode *bt);
	void preorder(binode *bt);
	void inorder(binode *bt);
	void count(binode *bt); 
	void postorder(binode *bt);
	void print(binode *bt,binode *pr);						//输出 双亲、孩子信息
	void printleaf(binode *bt);					//输出叶子信息

};
#endif

#include<iostream>
using namespace std;
#include"bitree.h"
int count=0;

binode *Bitree::creat(binode *bt)
{
	char ch;
	cout<<"请输入创建一棵二叉树的结点数据"<<endl;
	cin>>ch;
	if(ch=='#')return NULL;
	else{
		bt=new binode;
		bt->data=ch;
		bt->l=creat(bt->l);
		bt->r=creat(bt->r);
	}
	return bt;
}

void Bitree::release(binode *bt)
{
	if(bt!=NULL)
	{
		release(bt->l);
		release(bt->r);
		delete bt;
	}
}

void Bitree::preorder(binode *bt)
{
	if(bt==NULL)return;
	else{
		cout<<bt->data<<" ";
		preorder(bt->l);
		preorder(bt->r);
	}
}

void Bitree::inorder(binode *bt)
{
	if(bt==NULL)return;
	else{
		inorder(bt->l);
		cout<<bt->data<<" ";
		inorder(bt->r);
	}
}

void Bitree::postorder(binode *bt)
{
	if(bt==NULL) return ;
	else{
		postorder(bt->l);
		postorder(bt->r);
		cout<<bt->data<<" ";
	}
}
void Bitree::count(binode *bt)
{
	if(bt!=NULL)
	{
		count(bt->l);
		count++;
		count(bt->r);
		cout<<count<<" ";
	}
}

void Bitree::print(binode *bt,binode *pr)
{
	if(bt!=NULL)	
	{
		cout<<"结点为:"<<bt->data<<endl;
		if(bt->l!=NULL)
			cout<<"结点的左孩子为:"<<bt->l->data<<endl;
		else
			cout<<"该结点无左孩子."<<endl;
		if(bt->r!=NULL)
			cout<<"结点的右孩子为:"<<bt->r->data<<endl;
		else
			cout<<"该结点无右孩子."<<endl;
		if(pr!=NULL)
			cout<<"该结点的双亲为:"<<pr->data<<endl;
		else
			cout<<"该结点无双亲."<<endl;
		print(bt->l,bt);
		print(bt->r,bt);
	}
}
}  

void Bitree::printleaf(binode *bt)
{
	if(bt!=NULL)
	{
		if(bt->l==NULL&&bt->r==NULL)
		{
			cout<<bt->data<<endl;
			printleaf(bt->l);
			printleaf(bt->r);
	}  
}  
#include <iostream>
using namespace std;
#include "bitree.h"

int main()
{
	Bitree T;
	cout<<"------前序遍历------"<<endl;
	T.preorder();
	cout<<endl;
	cout<<"------中序遍历------"<<endl;
	T.inorder();
	cout<<endl;
	cout<<"------后序遍历------"<<endl;
	T.postorder();
	cout<<endl;
	cout<<"------孩子双亲------"<<endl;
	T.print();
	cout<<endl;
	cout<<"------叶子结点------"<<endl;   
	T.printleaf();     
	cout<<endl;  
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值