链式二叉树层序遍历算法实现

  二叉树常用的遍历方法除了先序遍历、中序遍历、后序遍历外,还有层序遍历。所谓层序遍历,就是指遍历二叉树时从上到下、从左到右按层进行遍历,本文仅实现二叉树层序遍历算法。

  由于层序遍历需要使用到队列,因此本程序借助于STL容器std::queue来实现。

  代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <queue>

typedef struct BiTNode {
    int data;
    struct BiTNode *left;
    struct BiTNode *right;
} Node;

//按先序序列建立一个二叉树 
Node* CreateBiTree() {
    char ch;
    
    scanf("%c", &ch);
    if (ch == ' ') {
        return 0;
    } else {
        Node* pstNode = (Node *)malloc(sizeof(Node));
        if (pstNode) {
            pstNode->data = ch;                    //根节点值 
            pstNode->left = CreateBiTree();        //创建左子树 
            pstNode->right= CreateBiTree();     //创建右子树 
        }
    }
}

void DestroyBiTree(Node **ppstNode) {
    if (0 == ppstNode) {
        return;
    }
    if (0 == *ppstNode) {
        return;
    }
    
    if ((*ppstNode)->left) {
        DestroyBiTree(&((*ppstNode)->left));
    }
    if ((*ppstNode)->right) { 
        DestroyBiTree(&((*ppstNode)->right));
    }
    free(*ppstNode);
    *ppstNode = 0;
}

//层序遍历 
void LevelOrderTraverse(Node *pstNode) {
    if (!pstNode) {
        return;
    }
    
    std::queue<Node *> q;
    q.push(pstNode);
    while (!q.empty()) {
        Node *pstTmp = q.front();
        q.pop(); 
        if (pstTmp) {
            printf("%c ", pstTmp->data);
            if (pstTmp->left) {
                q.push(pstTmp->left);
            }
            if (pstTmp->right) {
                q.push(pstTmp->right);
            }
        }
    }
}

int main () {
    Node *pstNode = CreateBiTree();
    
    printf("层序遍历 :"); 
    LevelOrderTraverse(pstNode); 
    printf("\n");
    
    DestroyBiTree(&pstNode);
    
    return 0;
}

  上述程序在遍历之前先使用函数CreateBiTree()创建了一个二叉树,创建二叉树时使用的是先序序列,使用先序序列生成二叉树的过程和先序遍历的实现类似,此处不详述。测试时,输入先序序列,比如:ABCΦΦDEΦGΦΦFΦΦΦ(Φ代表空格),此先序序列对应的二叉树如下图所示:

  上图所示的二叉树层序遍历结果如下:

 

posted on 2020-05-05 17:02  泣血  阅读(617)  评论(0编辑  收藏  举报

导航