一、实验目的:
1.掌握二叉树的定义;
2.掌握二叉树的基本操作,如二叉树的建立、遍历、结点个数统计、树的深度计算等。
二、实验内容:
用递归的方法实现以下算法:
1.以二叉链表表示二叉树,建立一棵二叉树;
2.输出二叉树的中序遍历结果;
3.统计二叉树的叶结点个数;
#include <iostream>
using namespace std;
//二叉链表的定义
typedef struct BiNode{
char data;
struct BiNode *lchild,*rchild;
} BiTNode,*BiTree;
//以二叉链表表示二叉树,建立一棵二叉树,传入一个头指针&T
//按先序遍历输入二叉树的值(字符),’#‘表示空结点
void CreatBiTree(BiTree &T){
char ch;
cin>>ch;
if(ch == '#') T=NULL;
else{
T = new BiTNode;
T->data=ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
//中序遍历二叉树
void InOrderTraverse(BiTree T){
if(T){
InOrderTraverse(T->lchild);
cout << T->data;
InOrderTraverse(T->rchild);
}
}
//统计二叉树的叶节点的个数
int NodeCount(BiTree T){
if(T==NULL) return 0;
else if(T->lchild==NULL & T->rchild==NULL){
return 1;
}
else {
return NodeCount(T->lchild)+NodeCount(T->rchild);
}
}
int main() {
BiTree tree;
cout<<"请输入建立二叉链表的序列:"<<endl;
CreatBiTree(tree);
cout<<"中序遍历的结果为:"<<endl;
InOrderTraverse(tree);
cout<<endl;
cout<<"二叉树中叶节点的个数为:"<<NodeCount(tree);
cout<<endl;
return 0;
}
用非递归的方法实现以下算法:
#include <iostream>
using namespace std;
//二叉树的二叉链表表示
typedef struct BiNode{
char data;
struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;
//链栈的定义
typedef struct StackNode{
BiTNode data;
struct StackNode *next;
}StackNode,*LinkStack;
//按照先序遍历创建二叉树
void CreatBiTree(BiTree &T){
char ch;
cin>>ch;
if(ch == '#') T=NULL;
else{
T = new BiTNode;
T->data=ch; //生成根节点
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
void InitStack(LinkStack &S)
{
//构造一个空栈S,栈顶指针置空
S=NULL;
}
bool StackEmpty(LinkStack S)
{
if(!S) return true;
else return false;
}
void Push(LinkStack &S,BiTree e)
{
// 在栈顶插入*e元素
StackNode *p = new StackNode;
p->data = *e;
p->next = S;
S = p;
}
void Pop(LinkStack &S,BiTree e)
{
if(S!=NULL)
{
*e=S->data;
StackNode *p=S;
S=S->next;
delete p;
}
}
//中序遍历二叉树
void InOrderTraverse(BiTree T){
LinkStack S;
BiTree p;
BiTree q=new BiTNode;
InitStack(S);
p=T;
while(p||!StackEmpty(S))
{
if(p)
{
Push(S, p);//p为非空根指针入栈,遍历左子树
p=p->lchild;
}
else
{
Pop(S, q); //p为空指针退栈,访问根节点,遍历右子树
cout<<q->data;
p=q->rchild;
}
}
}
int main(){
BiTree tree;
cout<<"请输入建立二叉链表的序列:"<<endl;
CreatBiTree(tree);
cout<<"中序遍历的结果为:"<<endl;
InOrderTraverse(tree);
cout<<endl;
return 0;
}
输出结果
请输入建立二叉链表的序列:
ABC##DE#G##F###
中序遍历的结果为:
CBEGDFA
二叉树中叶节点的个数为:3
Program ended with exit code: 0