一.实验目的
二叉树的遍历操作是树形结构其他众多操作的基础。本实验旨在使学生进一步加深对二叉树的先序、中序和后序等三种遍历次序特点的理解,熟悉二叉链表存储结构,熟练掌握二叉树上的递归算法的设计技术。
二.实验题目
1.构造一棵二叉树,使用二叉链表方式存储。
2设计程序,按照先序将这棵二叉树遍历出来,要求使用递归和非递归两种实现方式。
3.设计程序求二叉树中叶结点的个数。
#include "iostream"
using namespace std;
typedef struct bitree{
char data;
bitree* lchild;
bitree* rchild;
}*BiTree,BiNode;
int count=0;//非递归遍历时栈指针
int number=0;//计算叶子节点的计数器
void createTree(BiTree& T);
void traverse(BiTree& T);
void not_digui_traverser(BiTree &T);
void search_yezi_number(BiTree T);
int main(){
BiTree root;
createTree(root);
traverse(root);
cout<<endl;
not_digui_traverser(root);
cout<<endl;
search_yezi_number(root);
cout<<"The number of yezi is:"<<number<<endl;
return 0;
}
//先序创建二叉树
//ab#d##C#e##
void createTree(BiTree& T){
cout<<"Input element,if tree is null,please input #"<<endl;
char ch;
cin>>ch;
if('#'==ch){
T=NULL;
}
else{
T=new BiNode;
T->data=ch;
createTree(T->lchild);
createTree(T->rchild);
}
}
//递归先序遍历二叉树
void traverse(BiTree& T){
if(T==NULL){
return;
}
cout<<T->data;
traverse(T->lchild);
traverse(T->rchild);
}
//非递归先序遍历二叉树
//BiTree stack_BiTree[100]={NULL};用数组代替栈
/*
非递归时应用会破坏后面的根节点,所以需要一个变量t BiTree T=t;
*/
void not_digui_traverser(BiTree &t){
BiTree T=t;
BiTree stack_BiTree[100]={NULL};
while(T!=NULL||count!=0){
while(T!=NULL){
cout<<T->data;
stack_BiTree[count]=T;
count++;
T=T->lchild;
}
T=stack_BiTree[--count];
T=T->rchild;
}
}
void search_yezi_number(BiTree T){
if(T==NULL){
return;
}
if(T->lchild==NULL&&T->rchild==NULL){
number++;
}
search_yezi_number(T->lchild);
search_yezi_number(T->rchild);
}