目录
代码
#include <stdio.h>
#include <mm_malloc.h>
#define SIZE 100
#define MAX 1000
typedef struct BinNode BinNode;
struct BinNode{
char ch;
BinNode * left;
BinNode * right;
};
// 栈 结构体
typedef struct seqstack{
BinNode* data[SIZE];
int tag[SIZE]; //为后续遍历准备的
int top; //top为数组的下标
}Seqstack;
//入栈 出栈
void push(Seqstack *s,BinNode* t){
if(s->top == SIZE){
printf("the stack is fulln");
}else{
s->top++;
s->data[s->top]=t;
}
}
BinNode* pop(Seqstack *s){
if(s->top == -1){
return NULL;
}else{
s->top--;
return s->data[s->top+1];
}
}
//队列 结构体
typedef struct Seqqueue{
BinNode* data[MAX];
int front;
int rear;
}Seqqueue;
// 队列 入队 出队
void enter(Seqqueue *seqqueue,BinNode * binNode){
if(seqqueue->rear == MAX){
printf("the queue is full!n");
}else{
seqqueue->data[seqqueue->rear] = binNode;
seqqueue->rear++;
}
}
BinNode* del(Seqqueue *seqqueue){
if(seqqueue->front == seqqueue->rear){
return NULL;
}else{
seqqueue->front++;
return seqqueue->data[seqqueue->front-1];
}
}
// 前序遍历 创建二叉树
void CreateNode(BinNode ** binNode){
char ch;
scanf("%c",&ch);
if(ch=='#'){
*binNode=NULL;
}
else{
*binNode=(BinNode*)malloc(sizeof(BinNode));
(**binNode).ch=ch;
CreateNode(&(*binNode)->left);
CreateNode(&(*binNode)->right);
}
}
//**************二叉树遍历 相关实现 ******************
// 二叉树 前序 中序 后序 遍历递归实现
void PreShow(BinNode *binNode){
if(!binNode){
return;
}
else{
printf("%c",binNode->ch);
PreShow(binNode->left);
PreShow(binNode->right);
}
}
void MidShow(BinNode *binNode){
if(!binNode){
return;
}
else{
MidShow(binNode->left);
printf("%c",binNode->ch);
MidShow(binNode->right);
}
}
void BackShow(BinNode *binNode){
if(!binNode){
return;
}
else{
BackShow(binNode->left);
BackShow(binNode->right);
printf("%c",binNode->ch);
}
}
// 二叉树 前序 中序 后序 层次 遍历 非递归实现
void preShow(BinNode * binNode){
Seqstack seqstack;
seqstack.top=-1;
if(binNode==NULL){
printf("该树为空n");
}
else{
while (binNode||seqstack.top!=-1){
while (binNode){
printf("%c",binNode->ch);
push(&seqstack,binNode);
binNode=binNode->left;
}
binNode=pop(&seqstack);
binNode=binNode->right;
}
}
}
void midShow(BinNode * binNode){
Seqstack seqstack;
seqstack.top=-1;
if(binNode==NULL){
printf("the tree is empty!");
}
else{
while (binNode||seqstack.top!=-1){
while (binNode){
push(&seqstack,binNode);
binNode=binNode->left;
}
binNode=pop(&seqstack);
printf("%c",binNode->ch);
binNode=binNode->right;
}
}
}
void backShow(BinNode* binNode){
Seqstack seqstack;
seqstack.top=-1;
if(binNode==NULL){
printf("the tree is empty");
}
else{
while (binNode||seqstack.top!=-1){
//走到底
while (binNode){
push(&seqstack,binNode);
seqstack.tag[seqstack.top]=1; //表示第一次来
binNode=binNode->left;
}
//第一次来的时候,同层向右
if(seqstack.tag[seqstack.top]==1){
//同层向右
binNode=seqstack.data[seqstack.top];//上层节点
binNode=binNode->right;//上层节点 右孩子节点
seqstack.tag[seqstack.top]=2;//表示第二次来
}
else{//第二次来的时候,说明下面的已经都走完了
while (seqstack.tag[seqstack.top]==2){//这里走完连续走完两次的 节点不止有一个
binNode=pop(&seqstack);
printf("%c",binNode->ch);
}
binNode=NULL; //这样写,为以后出栈作准备
}
}
}
}
void PeerShow(BinNode * binNode){
Seqqueue seqqueue;
seqqueue.front=seqqueue.rear=0;
//空树结束
if(binNode==NULL){
printf("the tree is empty");
return;
}
else{
//当前入队
enter(&seqqueue,binNode);
//若队不为空,出一入二
while (seqqueue.front!=seqqueue.rear){
binNode=del(&seqqueue);
printf("%c",binNode->ch);
if(binNode->left){
enter(&seqqueue,binNode->left);
}
if(binNode->right){
enter(&seqqueue,binNode->right);
}
}
}
}
//二叉树高度
int Max(int a,int b){
return a>b?a:b;
}
int binHight(BinNode * binNode){
if(binNode==NULL){
return 0;
}
else{
return Max(binHight(binNode->left),binHight(binNode->right))+1;
}
}
//二叉树节点数
int nodeNum(BinNode* binNode){
if(binNode==NULL){
return 0;
}
else{
return nodeNum(binNode->left)+nodeNum(binNode->right)+1;
}
}
//二叉树的查找
BinNode * searchBin(BinNode* binNode, char ch){
if(!binNode){
return NULL;
}
if(binNode->ch==ch){
return binNode;
}
else{
BinNode* r1=searchBin(binNode->left,ch);
BinNode* r2=searchBin(binNode->right,ch);
if(r1){
return r1;
}
if(r2){
return r2;
}
}
return NULL;
}
//判断两棵树是否相等
int isBinEqual(BinNode* binNode1,BinNode * binNode2){
if(!binNode1 && !binNode2){
return 1;
}
else{
if(binNode1&&binNode2&&binNode1->ch==binNode2->ch){
int r1=isBinEqual(binNode1->left,binNode2->left);
int r2=isBinEqual(binNode1->right,binNode2->right);
if(r1==1&&r2==1){
return 1;
}
return 0;
}
return 0;
}
}
int main(){
BinNode * binNode;
// 测试用例: 531##4##86#7##9##
printf("请输入二叉树前序遍历结果:");
CreateNode(&binNode);
//遍历的递归实现
printf("前序遍历结果:");
PreShow(binNode);
printf("n中序遍历结果:");
MidShow(binNode);
printf("n后序遍历结果:");
BackShow(binNode);
//非递归遍历实现
printf("先序遍历:");
preShow(binNode);
printf("n中序遍历:");
midShow(binNode);
printf("n后序遍历:");
backShow(binNode);
printf("n层次遍历:");
PeerShow(binNode);
printf("n二叉树节点数:%d",nodeNum(binNode));
//二叉树的查找
printf("n节点[7]的位置位于:%p,结果为%c",searchBin(binNode,'7'),searchBin(binNode,'7')->ch);
BinNode * result=searchBin(binNode,'2');
if(result==NULL){
printf("n节点[2]未搜索到");
}
printf("n二叉树高度:%d",binHight(binNode));
//判断两棵树是否相等 测试用例: 531##4##86#7##9## 531##4##86#7##2##
BinNode * binNode1;
getchar();
printf("n请输入第二棵二叉树前序遍历结果:");
CreateNode(&binNode1);
printf("第一棵树前序遍历:");
preShow(binNode);
printf("n第二棵树前序遍历");
preShow(binNode1);
printf("n判断结果两棵树:%d(1相等,0不相等)",isBinEqual(binNode,binNode1));
return 0;
}
运行结果