實現二叉樹的層次遍歷算法,並對用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”創建的二叉樹進行測試
btree.h
#ifndef BTREE_H_INCLUDED
#define BTREE_H_INCLUDED
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ElemType data; //數據元素
struct node *lchild; //指向左孩子
struct node *rchild; //指向右孩子
} BTNode;
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); //銷燬二叉樹
#endif // BTREE_H_INCLUDED
btree.cpp
- #include <stdio.h>
- #include <malloc.h>
- #include "btree.h"
- void CreateBTNode(BTNode *&b,char *str) //由str串創建二叉鏈
- {
- BTNode *St[MaxSize],*p=NULL;
- int top=-1,k,j=0;
- char ch;
- b=NULL; //建立的二叉樹初始時爲空
- ch=str[j];
- while (ch!='\0') //str未掃描完時循環
- {
- 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) //p指向二叉樹的根節點
- b=p;
- else //已建立二叉樹根節點
- {
- switch(k)
- {
- case 1:
- St[top]->lchild=p;
- break;
- case 2:
- St[top]->rchild=p;
- break;
- }
- }
- }
- j++;
- ch=str[j];
- }
- }
- BTNode *FindNode(BTNode *b,ElemType x) //返回data域爲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) //返回*p節點的左孩子節點指針
- {
- return p->lchild;
- }
- BTNode *RchildNode(BTNode *p) //返回*p節點的右孩子節點指針
- {
- return p->rchild;
- }
- int BTNodeDepth(BTNode *b) //求二叉樹b的深度
- {
- int lchilddep,rchilddep;
- if (b==NULL)
- return(0); //空樹的高度爲0
- else
- {
- lchilddep=BTNodeDepth(b->lchild); //求左子樹的高度爲lchilddep
- rchilddep=BTNodeDepth(b->rchild); //求右子樹的高度爲rchilddep
- return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+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 DestroyBTNode(BTNode *&b) //銷燬二叉樹
- {
- if (b!=NULL)
- {
- DestroyBTNode(b->lchild);
- DestroyBTNode(b->rchild);
- free(b);
- }
- }
main.cpp
#include <stdio.h> #include "btree.h" 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; } } } int main() { BTNode *b; CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"); printf("二叉樹b: "); DispBTNode(b); printf("\n"); printf("層次遍歷序列:\n"); LevelOrder(b); DestroyBTNode(b); return 0; }