1. 程式人生 > >二叉樹演算法驗證】之層次遍歷演算法的驗證

二叉樹演算法驗證】之層次遍歷演算法的驗證

Copyright(c) 2017,煙臺大學計算機與控制工程學院
All rights reserved.
檔名稱:text.cpp
作者:黃瀟慧
完成日期:2017年11月2日
版本:vc6.0
問題描述:實現二叉樹的層次遍歷演算法,並對用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”建立的二叉樹進行測試
輸入描述:
輸出描述:
程式碼實現:
z.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

z.cpp

#include <stdio.h>
#include <malloc.h>
#include "z.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 "z.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;
}

執行過程
這裡寫圖片描述

這裡寫圖片描述
實踐心得:
採用層級遍歷的方法就行二叉樹的遍歷,與環形佇列的知識相結合,所以學好二叉樹還要充分掌握前面的基本知識。