二叉树的基本操作

#include<iostream>
using namespace std;

/*
定义二叉树的数据结构
*/

int MAXSIZE = 100;

typedef struct Node{

char data;
struct Node* lchild;
struct Node* rchild;
}*BitTree,BitNode;

//声明与二叉树相关的操作函数

//1.初始化二叉树
void InitBitTree(BitTree &T);
//2.创建二叉树的操作
void CreateBitTree(BitTree &T);
//3.先序遍历二叉树
void PreOrderBitTree(BitTree &T);
//4.中序遍历二叉树
void InOrderBitTree(BitTree &T);
// 5.后序遍历二叉树
void PostOrderBitTree(BitTree &T);
//6.二叉树的层次遍历
void LevelOrderBitTree(BitTree &T);
//8.返回二叉树的叶子节点的个数
int LeafNum(BitTree &T);
//7.求二叉树的高度
int BitTreeDepth(BitTree &T);



//1.初始化二叉树
void InitBitTree(BitTree &T){

T = NULL;
}


//2.创建二叉树的操作
void CreateBitTree(BitTree &T){

char ch;
cin>>ch;

if(ch=='#') { T = NULL;}
else{
T = (BitTree)malloc(sizeof(BitNode));
if(T==NULL){

exit(-1);
}
T->data = ch;
CreateBitTree(T->lchild);
CreateBitTree(T->rchild);
}

}
//3.先序遍历二叉树,采用非递归的方式遍历二叉树
void PreOrderBitTree(BitTree &T){

BitTree stack[MAXSIZE];
int top = 0;
BitTree p = T;
while(p!=NULL||top>0){

while(p!=NULL){
cout<<p->data<<" ";
stack[top++] = p;
p=p->lchild;
}
if(top>0){

p = stack[--top];
p = p->rchild;
}
}
cout<<endl;
}

//4.中序遍历二叉树,采用非递归的方式遍历二叉树
void InOrderBitTree(BitTree &T){


BitTree stack[MAXSIZE];
int top = 0;
BitTree p = T;
while(p!=NULL||top>0){

while(p!=NULL){

stack[top++] = p;
p=p->lchild;
}
if(top>0){

p = stack[--top];
cout<<p->data<<" ";
p = p->rchild;
}
}
cout<<endl;
}

// 后序遍历二叉树,采用非递归的方式遍历二叉树
void PostOrderBitTree(BitTree &T){
BitTree stack[MAXSIZE];
int top = 0;
BitTree p = T;
BitTree q = NULL;
while(p!=NULL||top>0){

while(p!=NULL){

stack[top++] = p;
p=p->lchild;
}
if(top>0){
p = stack[top-1];
if(p->rchild == NULL||p->rchild == q){

cout<<p->data<<" ";
top--;
q=p;
p=NULL;

}else{
p = p->rchild;
}
}
}
cout<<endl;
}

//6.二叉树的层次遍历
void LevelOrderBitTree(BitTree &T){
BitTree Queue[MAXSIZE];
int front = -1;
int rear = -1;
rear++;
Queue[rear] = T;
BitTree p = NULL;
while(front!=rear){

front = (front+1)%MAXSIZE;
p = Queue[front];
cout<<p->data<<" ";
if(p->lchild!=NULL){
rear = (rear+1)%MAXSIZE;
Queue[rear] = p->lchild;
}
if(p->rchild!=NULL){
rear = (rear+1)%MAXSIZE;
Queue[rear] = p->rchild;
}

}
cout<<endl;
}

//8.返回二叉树的叶子节点的个数
int LeafNum(BitTree &T){

if(!T) return 0;
if(!(T->lchild)&&!(T->rchild))
return 1;
else
return LeafNum(T->lchild)+LeafNum(T->rchild);

}
//7.求二叉树的高度
int BitTreeDepth(BitTree &T){

if(!T) return 0;

int lh = BitTreeDepth(T->lchild);
int rh = BitTreeDepth(T->rchild);
return lh>rh?1+lh:1+rh;

}


int main(){

BitTree T;

cout<<"创建一个二叉树:"<<endl;
CreateBitTree(T);

cout<<"线序遍历二叉树:"<<endl;
PreOrderBitTree(T);

cout<<"中序遍历二叉树:"<<endl;
InOrderBitTree(T);

cout<<"后序遍历二叉树:"<<endl;
PostOrderBitTree(T);

cout<<"按层次遍历二叉树:"<<endl;
LevelOrderBitTree(T);

cout<<"输出二叉树的叶子节点个数:"<<endl;
cout<<LeafNum(T)<<endl;

cout<<"输出二叉树的高度:"<<endl;
cout<<BitTreeDepth(T)<<endl;

system("pause");

return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值