下面是用链表做的一个二叉树,包含了二叉树的创建、先序遍历,中序遍历,后序遍历的递归操作和非递归操作,还有求二叉树的的高度,根节点到某一节点的路径,叶子结点个数和总节点个数。
万年的头文件
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define MAX_TREE_SIZE 100
using namespace std;
二叉树的链式存储结构:
typedef char TElemType;
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild,*rchlid;//左子女和又子女
}BiTNode,*BiTree;
创建二叉树,并求二叉树总结点数
int CreateBiTree(BiTree &BT,int &count_Node){//创建二叉树
char ch;
cout<<"请输入当前节点值:";
cin>>ch;
if (ch=='#')//#表示空
BT=NULL;
else{
if(!(BT=(BiTree)malloc(sizeof(BiTNode)))) exit (-1);//如果没有成功的申请到内存空间则结束程序
BT->data=ch;
count_Node++;
CreateBiTree(BT->lchild,count_Node);
CreateBiTree(BT->rchlid,count_Node);
}
return 1;
}
先序遍历二叉树的递归操作:
void PreOrder (BiTree BT) {//递归先序遍历二叉树
if (BT != NULL){
cout<<BT->data<<' '<<endl;
PreOrder(BT->lchild);
PreOrder(BT->rchlid);
}
}
中序遍历二叉树的递归操作
void InOrder (BiTree BT) {//递归中序遍历二叉树
if (BT != NULL){
InOrder(BT->lchild);
cout<<BT->data<<' '<<endl;
InOrder(BT->rchlid);
}
}
后序遍历二叉树的递归操作:
void PostOrder (BiTree BT) {//递归后序遍历二叉树
if (BT != NULL){
PostOrder(BT->lchild);
PostOrder(BT->rchlid);
cout<<BT->data<<' '<<endl;
}
}
先序遍历二叉树的非递归操作:
void NRPerOrder(BiTree BT){//非递归先序遍历二叉树
BiTree stack[MAX_TREE_SIZE],p;
int top;
if (BT!=NULL){
top=1;
stack[top]=BT;
while(top>0){
p=stack[top];
top--;
cout<<p->data<<' '<<endl;
if (p->rchlid!=NULL){
top++;
stack[top]=p->rchlid;
}
if (p->lchild!=NULL){
top++;
stack[top]=p->lchild;
}
}
}
}
中序遍历二叉树的非递归操作:
void NRInOrder(BiTree BT){//非递归中序遍历二叉树
BiTree stack[MAX_TREE_SIZE],p;
int top=0;
p=BT;
do{
while(p!=NULL){
top++;
stack[top]=p;
p=p->lchild;
}
if (top>0){
p=stack[top];
top--;
cout<<p->data<<' '<<endl;
p=p->rchlid;
}
}while (p!=NULL||top>0);
}
后序遍历二叉树的非递归操作:
void NRPostOrder(BiTree BT){//后序遍历二叉树
BiTree stack[MAX_TREE_SIZE],p;
int tag[MAX_TREE_SIZE];
int top=0;
p=BT;
do{
while (p!=NULL){
top++;
stack[top]=p;
tag[top]=0;
p=p->lchild;
}
if(top>0){
if (tag[top]==1){
cout<<stack[top]->data<<' '<<endl;
top--;
}
else{
p=stack[top];
if (top>0){
p=p->rchlid;
tag[top]=1;
}
}
}
} while (p!=NULL||top>0);
}
菜单页面:
void Menu(){
printf(" 二叉树\n");
printf("----------------------------------------------\n");
printf(" 菜单选项:\n");
cout<<"1 ------------------------ 创建二叉树"<<endl;
cout<<"2 ------------------------ 先序遍历二叉树递归操作"<<endl;
cout<<"3 ------------------------ 中序遍历二叉树递归操作"<<endl;
cout<<"4 ------------------------ 后序遍历二叉树递归操作"<<endl;
cout<<"5 ------------------------ 先序遍历二叉树非递归操作"<<endl;
cout<<"6 ------------------------ 中序遍历二叉树非递归操作"<<endl;
cout<<"7 ------------------------ 后序遍历二叉树非递归操作"<<endl;
cout<<"8 ----------------------- 退出"<<endl;
cout<<"请选择您需要的操作:";
}
主函数:
int main() {
BiTree BT,p;
int n,count_leaves=0,deep_tree,count_Node=0;
int flag=0;
Menu();
cin>>n;
while(n!=8){
switch(n){
case 1:
flag=CreateBiTree(BT,count_Node);
if(flag==1) cout<<"创建成功!"<<endl;
break;
case 2:
PreOrder (BT);
break;
case 3:
InOrder (BT);
break;
case 4:
PostOrder (BT);
break;
case 5:
NRPerOrder(BT);
break;
case 6:
NRInOrder(BT);
break;
case 7:
NRPostOrder(BT);
break;
default:
cout<<"输入有误,请重新输入:";
break;
}
cout<<"请继续选择您的操作:";
cin>>n;
}
free (BT);
return 0;
}