树和二叉树的实验2

一、实验目的 

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

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

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

二、 实验内容

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

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

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

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

三、算法分析

定义tree类,树结点类型为字符型,定义公有函数:构造、析构、遍历、双亲孩子函数,为避免类的调用者访问tree类的私有变量root,调用相应的私有函数。

空结点用#表示。

四、源代码

#include<iostream>
using namespace std;
struct node
{
	char data;
	node *lchild,*rchild;
};
class tree
{
public:
	tree(){root=Create(root);}
	~tree(){Release(root);}
	void PreOrder(){PreOrder(root);}
	void InOrder(){InOrder(root);}
	void PostOrder(){PostOrder(root);}
	void parentchild(){parentchild(root,NULL);}
	void leaf(){leaf(root);}
private:
	node *root;
	node *Create(node *bt);
	void Release(node *bt);
	void PreOrder(node *bt);
	void InOrder(node *bt);
	void PostOrder(node *bt);
	void parentchild(node *bt,node *p);
	void leaf(node *bt);
};
node *tree::Create(node *bt)
{
	char c;
	cin>>c;
	if(c=='#') return NULL;
	else{
		bt=new node;
		bt->data=c;
		bt->lchild=Create(bt->lchild);
		bt->rchild=Create(bt->rchild);
	}
	return bt;
}
void tree::Release(node *bt)
{
	if(bt!=NULL)
	{
		Release(bt->lchild);
		Release(bt->rchild);
		delete bt;
	}
}
void tree::PreOrder(node *bt)
{
	if(bt==NULL)return;
	else{
		cout<<bt->data<<" ";
		PreOrder(bt->lchild);
		PreOrder(bt->rchild);
	}
}
void tree::InOrder(node *bt)
{
	if(bt==NULL)return;
	else{
		InOrder(bt->lchild);
		cout<<bt->data<<" ";
		InOrder(bt->rchild);
	}
}
void tree::PostOrder(node *bt)
{
	if(bt==NULL)return;
	else{
		PostOrder(bt->lchild);
		PostOrder(bt->rchild);
		cout<<bt->data<<" ";
	}
}
void tree::parentchild(node *bt,node *p)
{
	if(bt!=NULL)
	{
		cout<<"结点"<<bt->data<<" ";
		if(bt->lchild!=NULL)
			cout<<"左孩子"<<bt->lchild->data<<" ";
		else 
			cout<<"没左孩子"<<" ";
		if(bt->rchild!=NULL)
			cout<<"右孩子"<<bt->rchild->data<<" ";
		else 
			cout<<"没右孩子"<<" ";
		if(p!=NULL)
			cout<<"双亲"<<p->data;
		else cout<<"没双亲";
		cout<<endl;
		parentchild(bt->lchild,bt);
		parentchild(bt->rchild,bt);
	}
}
void tree::leaf(node *bt)
{	
	if(bt!=NULL)
	{
		if(bt->lchild==NULL&&bt->rchild==NULL)
			cout<<bt->data<<" ";
		leaf(bt->lchild);
		leaf(bt->rchild);
	}
}

int main()
{
	cout<<"请输入创建一颗二叉树的结点数据:"<<endl;
	tree T;
	cout<<"前序遍历:"<<endl;
	T.PreOrder();
	cout<<endl;
	cout<<"中序遍历:"<<endl;
	T.InOrder();
	cout<<endl;
	cout<<"后序遍历:"<<endl;
	T.PostOrder();
	cout<<endl;
	char x;
	cout<<"叶子为:"<<endl;
	T.leaf();
	cout<<endl;
	T.parentchild();
	cout<<endl;
	return 0;
}
五、运行结果


六、心得

    这次实验对二叉链表有了更深的认识,学会在函数中调用对应的私有函数,主要是找双亲有点困难,在同学的帮助下勉强完成,即在parentchild函数加多一个指向结点双亲的形参。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值