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

实验 5:树和二叉树的实验

 

一、实验目的 

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

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

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

二、实验内容 

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

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

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

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

程序源代码:

#ifndef BiTree_H

扫描二维码关注公众号,回复: 1002066 查看本文章

#define BiTree_H

struct BiNode

{

char data;

BiNode *lchild,*rchild;

};

class BiTree

{

public:

BiTree(){root=Creat(root);}   //构造函数,建立一颗二叉树

~BiTree(){Release(root);}   //析构函数,释放各结点的存储空间

void PreOrder(){PreOrder(root);}   //前序遍历二叉树

void InOrder(){InOrder(root);}   //中序遍历二叉树

void PostOrder(){PostOrder(root);}   //后序遍历二叉树

void Count(){Count(root);} //统计结点数

void CountLeaf(){CountLeaf(root);}  //统计叶子结点数

private:

BiNode *root;   //指向根结点的头指针

BiNode *Creat(BiNode *bt);  //构造函数调用

void Release(BiNode *bt);  //析构函数调用

void PreOrder(BiNode *bt);  //前序遍历函数调用

void InOrder(BiNode *bt);  //中序遍历函数调用

void PostOrder(BiNode *bt);  //后序遍历函数调用

void Count(BiNode *bt);  

void CountLeaf(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;  //生成一个结点,数据域为ch

bt->lchild=Creat(bt->lchild);  //递归建立左子树

bt->rchild=Creat(bt->rchild);  //递归建立右子树

}

return bt;

}

void BiTree::Release(BiNode *bt)

{

if(bt!=NULL)

{

Release(bt->lchild);  //释放左子树

Release(bt->rchild);  //释放右子树

delete bt;

}

}

void BiTree::PreOrder(BiNode *bt)

{

if(bt==NULL)return;  //递归调用的结束条件

else

{

cout<<bt->data<<" ";   //访问根结点bt的数据域

PreOrder(bt->lchild);  //前序递归遍历bt的左子树

PreOrder(bt->rchild);  //前序递归遍历bt的右子树

}

}

void BiTree::InOrder(BiNode *bt)

{

    if(bt==NULL)return;  //递归调用的结束条件

else

{

    InOrder(bt->lchild);  //中序递归遍历bt的左子树

cout<<bt->data<<" ";  //访问根结点的数据域

InOrder(bt->rchild);  //中序递归遍历bt的右子树

}

}

void BiTree::PostOrder(BiNode *bt)

{

if(bt==NULL)return;  //递归调用的结束条件

else

{

PostOrder(bt->lchild);  //后序递归遍历bt的左子树

PostOrder(bt->rchild);  //后序递归遍历bt的右子树

cout<<bt->data<<" ";    //访问根结点的数据域

}

}

void BiTree::Count(BiNode *bt)

{

if(bt!=NULL)

{

Count(bt->lchild);

count++;

Count(bt->rchild);

cout<<count<<" ";

}

}

void BiTree::CountLeaf(BiNode *bt)

{

if(bt->lchild==NULL && bt->rchild==NULL)

{

count++;

CountLeaf(bt->lchild);

CountLeaf(bt->rchild);

}

cout<<count;

}

#include<iostream>

using namespace std;

#include"BiTree1.h"

int main()

{

BiTree T;

cout<<"前序遍历:";

T.PreOrder();

cout<<endl;

cout<<"中序遍历:";

T.InOrder();

cout<<endl;

cout<<"后序遍历:";

T.PostOrder();

cout<<endl;

cout<<"结点数:";

T.Count();

cout<<endl;

cout<<"叶子结点数:";

T.CountLeaf();

cout<<endl;

return 0;

}

运行结果:

 

猜你喜欢

转载自blog.csdn.net/Smart_J_King/article/details/80424378