数据结构-二叉树层次遍历
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                数据结构-二叉树层次遍历
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                首先介紹下二叉樹的層次遍歷即按照順序對樹節點依次訪問,如下圖:
順序遍歷的結果為:ABCDEFGHIJK
我們可以借助一個隊列來實現二叉樹的層次遍歷;思路如下:
先將二叉樹根節點入隊,然后出隊,訪問該節點,如果有左子樹,則將左子樹根節點入隊;如果有右子樹,則將右子樹根節點入隊。然后出隊,對出隊節點訪問,如此循環
直到隊列為空。
代碼實現:
// // Created by Administrator on 2018/6/5. // /*** 層次遍歷:通過輔助隊列實現二叉樹的層次遍歷*/ #include "stdio.h" #include "stdlib.h"/*** 定義一棵樹*/ typedef struct {char data;struct BitTreeNode *lchild, *rchild; } BitTreeNode, *BitTree;/*** 定義一個隊列節點*/ typedef struct {BitTree data;//節點元素struct QNode *next;//節點指向下一個節點的指針域 } QNode;/*** 定義一個隊列:鏈式隊列*/ typedef struct {//隊列的頭指針,尾指針:頭指針始終指向頭節點,尾指針隨著元素入隊向后移動// 如果隊列為空則頭指針=尾指針同時指向頭節點QNode *front, *rear; } LinkQueue;/*** 前序法創建樹* @param tree* @return*/ BitTree createTree(BitTree tree) {char c;scanf("%c", &c);if (c == '#') {return 0;} else {tree = (BitTree) malloc(sizeof(BitTreeNode));tree->data = c;tree->lchild = createTree(tree->lchild);tree->rchild = createTree(tree->rchild);}return tree; }/*** 初始化隊列* @param q*/ void initQueue(LinkQueue *q) {q->front = q->rear = (QNode *) malloc(sizeof(QNode));q->front->next = NULL; }/*** 入隊操作* @param q* @param tree*/ void enQueue(LinkQueue *q, BitTree tree) {//開辟節點空間QNode *s = (QNode *) malloc(sizeof(QNode));//節點數據域賦值s->data = tree;//隊列尾指針的指針域指向該節點q->rear->next = s;//隊列尾指針移動到該節點q->rear = s; }/*** 出隊操作* @param q* @return*/ BitTree deQueue(LinkQueue *q) {//獲取頭結點的下一個節點QNode *s = q->front->next;//獲取數據元素BitTree tree = s->data;//隊列頭指針的指針域指向出隊節點的下一個節點q->front->next = s->next;if (s == q->rear) {//如果出隊節點為隊列尾指針,則說明該節點為隊列的最后一個元素節點//將尾指針指向頭指針(頭指針指向了頭結點)q->rear = q->front;}free(s);return tree; }void visit(char data) {printf("%c", data); }/*** 二叉樹層次遍歷* @param tree* @param queue*/ void levelOrder(BitTree tree, LinkQueue queue) {initQueue(&queue);BitTree p;enQueue(&queue, tree);while (queue.front != queue.rear) {p = deQueue(&queue);visit(p->data);if (p->lchild != NULL) {enQueue(&queue, p->lchild);}if (p->rchild != NULL) {enQueue(&queue, p->rchild);}} }int main() {LinkQueue queue;BitTree tree;tree = createTree(tree);printf("層次遍歷結果:\n");levelOrder(tree, queue);return 0; }總結
以上是生活随笔為你收集整理的数据结构-二叉树层次遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: @和./的区别
 - 下一篇: 数据结构-二叉排序树