一、实验内容要求
1.基于前序序列,构建二叉树的二叉链表存储结构
2.对建立的二叉树进行前序、中序、后序、层序遍历操作
3.求二叉树叶子结点个数并输出叶子结点信息
二叉树图示:
二、代码
#include <iostream>
using namespace std;
extern int count; //全局变量
int count = 0;
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 LevelOrder() //层序遍历
{
LevelOrder(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 LevelOrder(BiNode * bt);
void CountLeaf(BiNode * bt);
};
BiNode * BiTree::Creat(BiNode * bt) //建定义立二叉链表的函数
{
char ch;
cout << "输入结点数据" << endl;
cin >> ch;
if(ch == '#')
{
return NULL;
}else
{
bt = new BiNode;
bt -> data = 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 << " ";
PreOrder(bt -> lchild);
PreOrder(bt -> rchild);
}
}
void BiTree::InOrder(BiNode * bt)
{
if(bt == NULL)
{
return;
}else
{
InOrder(bt -> lchild);
cout << bt -> data << " ";
InOrder(bt -> rchild);
}
}
void BiTree::PostOrder(BiNode * bt)
{
if(bt == NULL)
{
return;
}else
{
PostOrder(bt -> lchild);
PostOrder(bt -> rchild);
cout << bt -> data << " ";
}
}
void BiTree::LevelOrder(BiNode * bt)
{
BiNode * Q[100],* q = NULL;
int front = -1,rear = -1;
if(root == NULL)
{
return;
}
Q[++rear] = root;
while(front != rear)
{
q = Q[++front];
cout << q -> data << " ";
if(q -> lchild != NULL)
{
Q[++rear] =q -> lchild;
}
if(q -> rchild != NULL)
{
Q[++rear] =q -> rchild;
}
}
}
void BiTree::CountLeaf(BiNode * bt)
{
if(bt != NULL)
{
if(bt -> lchild == NULL && bt -> rchild == NULL)
{
count++;
cout << bt -> data << " ";
}
CountLeaf(bt -> lchild);
CountLeaf(bt -> rchild);
}
}
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.LevelOrder();
cout << endl;
cout << "叶子结点:" << endl;
T.CountLeaf();
cout << endl;
cout << "叶子结点个数为:" << count << endl;
return 0;
}
三、实验结果