问题及代码:
/* 烟台大学计算机学院 文件名称:xiangmu.cpp 作者:刘泽齐 完成日期:2017年12月5日 问题描述:层次遍历算法的验证 输入描述:无 输出描述:层次遍历树的结果 */
btree2.h
btree2.cpp:#include <stdio.h> #define MaxSize 100 typedef char ElemType; typedef struct node { ElemType data; struct node *lchild; struct node *rchild; }BTNode; typedef struct { BTNode *data[MaxSize]; int front,rear; }SqQueue; void CreateBTNode(BTNode *&b,char *str); //由str串创建二叉链 BTNode *FindNode(BTNode *b,ElemType x); //返回data域为x的节点指针 BTNode *LchildNode(BTNode *p); //返回*p节点的左孩子节点指针 BTNode *RchildNode(BTNode *p); //返回*p节点的右孩子节点指针 int BTNodeDepth(BTNode *b); //求二叉树b的深度 void DispBTNode(BTNode *b); //以括号表示法输出二叉树 void DestroyBTNode(BTNode *&b); //销毁二叉树 void LevelOrder(BTNode *b);//层次遍历
main:#include <malloc.h> #include <stdio.h> #include "btree2.h" void CreateBTNode(BTNode *&b,char *str) { BTNode *St[MaxSize],*p; int top=-1,k,j=0; char ch; b=NULL; //建立的二叉树初始时为空 ch=str[j]; while(ch!='\0') //扫描字符串 { switch(ch)//遇到字母。左右括号,逗号的操作 { case '(':top++; St[top]=p; k=1; break; case ')': top--; break; case ',': k=2; break; default:p=(BTNode*)malloc(sizeof(BTNode)); p->data=ch; p->lchild=p->rchild=NULL; if(b==NULL) { b=p; } else { switch(k) { case 1: St[top]->lchild=p; break; case 2: St[top]->rchild=p; break; } } } j++; ch=str[j]; } } void DestroyBTNode(BTNode *&b) { if(b!=NULL) { DestroyBTNode(b->lchild);//销毁左子树 DestroyBTNode(b->rchild);//销毁右子树 free(b);//销毁根结点 } } BTNode *FindNode(BTNode *b,ElemType x) { BTNode *p; if(b==NULL) { return NULL; } else if(b->data==x) return b; else { p=FindNode(b->lchild,x);//递归查找该结点 if(p!=NULL) { return p; } else return FindNode(b->rchild,x); } } BTNode *LchildNode(BTNode *p)//求左子树 { return p->lchild; } BTNode *RchildNode(BTNode *p)//求右子树 { return p->rchild; } int BTNodeDepth(BTNode *b) { int lchildh; int rchildh; if(b==NULL) return 0;//空树 else { lchildh=BTNodeDepth(b->lchild);//递归求根结点左子树 rchildh=BTNodeDepth(b->rchild);//递归求根结点右子树 { if(lchildh>rchildh) { return lchildh+1; } else { return rchildh+1; } } } } void DispBTNode(BTNode *b)//以括号表示法输出二叉树 { if(b!=NULL) { printf("%c",b->data); if(b->lchild!=NULL || b->rchild!=NULL) { printf("("); DispBTNode(b->lchild); if(b->rchild!=NULL) { printf(","); DispBTNode(b->rchild); } printf(")"); } } } void LevelOrder(BTNode *b) { BTNode *p; BTNode *qu[MaxSize]; int front,rear; front=rear=-1; rear++; qu[rear]=b; while(front!=rear)//层次遍历循环队列 { front=(front+1)%MaxSize; p=qu[front]; printf("%c",p->data); if(p->lchild!=NULL) { rear=(rear+1)%MaxSize; qu[rear]=p->lchild; } if(p->rchild!=NULL) { rear=(rear+1)%MaxSize; qu[rear]=p->rchild; } } }
#include <stdio.h> #include <malloc.h> #include "btree2.h" int main() { BTNode *p; CreateBTNode(p,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");//创建二叉树 printf("输出二叉树\n"); DispBTNode(p);//输出二叉树 printf("层次遍历,输出结果\n"); LevelOrder(p);//层次遍历 DestroyBTNode(p);//销毁 return 0; }
运行结果: