链式二叉树层序遍历算法实现
二叉树常用的遍历方法除了先序遍历、中序遍历、后序遍历外,还有层序遍历。所谓层序遍历,就是指遍历二叉树时从上到下、从左到右按层进行遍历,本文仅实现二叉树层序遍历算法。
由于层序遍历需要使用到队列,因此本程序借助于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ΦΦΦ(Φ代表空格),此先序序列对应的二叉树如下图所示:
上图所示的二叉树层序遍历结果如下: