網站首頁 編程語言 正文
什么是層次遍歷?
對于一顆二叉樹來說,從根節點開始,按從上到下、從左到右的順序訪問每一個結點。
注:每一個結點有且訪問一次。
那我們如何來實現這個算法呢?
實現原理:
對于二叉樹來說,它是一個遞歸的定義,我們要實現層次遍歷必然要滿足從上到下、從左到右這個要求,從根結點出發,我們可以將所有意義上的根結點都存儲在隊列之中,那我們可以使用隊列先進先出的特點來實現要求的遍歷。
這里我們需要引用隊列來實現。
主體代碼:
BiTree InitTree()//二叉樹的創建 { BiTree T =(BiTree) malloc(sizeof(Tree)); char data; scanf("%c", &data); getchar(); if (data == '#')//如果data為#則該子樹為空值 return NULL; else { T->data = data; printf("請輸入%c的左子樹:\n", data); T->lchild = InitTree(); printf("請輸入%c的右子樹:\n", data); T->rchild = InitTree(); } return T; } void ShowCengci(BiTree T) { LinkQueue qu; InitQueue(&qu);//初始化隊列 enQueue(&qu, T);//根結點入隊 while (QueueEmpty(qu))//判斷隊列中是否為空 { BiTree S = deQueue(&qu);//根節點出隊 printf("%c ", S->data); if (S->lchild != NULL)//判斷左右子樹是否為空,不為空則入隊 { enQueue(&qu, S->lchild); } if (S->rchild != NULL) { enQueue(&qu, S->rchild); } }
隊列的鏈式實現:
typedef struct BTree { char data; struct BTree* lchild; struct BTree* rchild; }Tree,*BiTree; typedef struct Queue { BiTree data; struct Queue* next; }Qnode,*Queueptr; typedef struct point { Queueptr front;//頭指針 Queueptr rear;//尾指針 }LinkQueue; void InitQueue(LinkQueue* qu) { qu->front = qu->rear = (Queueptr)malloc(sizeof(Qnode)); if (qu->front == NULL) return; } void enQueue(LinkQueue* qu, BiTree S) { Queueptr p = (Queueptr)malloc(sizeof(Qnode)); if (p == NULL) { return; } if (S == NULL) return; p->data = S; p->next = NULL; qu->rear->next = p; qu->rear = p; } int QueueEmpty(LinkQueue qu) { if (qu.front != qu.rear) return 1; else return 0; } BiTree deQueue(LinkQueue* qu) { if (qu->front == qu->rear) return; Queueptr p = qu->front->next; BiTree q = p->data; qu->front->next = p->next; if (qu->rear == p) qu->rear = qu->front; free(p); return q; }
通關上述代碼可以實現對二叉樹的層次遍歷。
總結
原文鏈接:https://blog.csdn.net/Rinki123456/article/details/122569365
相關推薦
- 2022-04-18 http通過StreamingHttpResponse完成連續的數據傳輸長鏈接方式_python
- 2022-06-06 uniApp實現滾動視圖點擊錨點跳轉、點擊左側分欄時右側對應內容置頂、左右分欄聯動、getSyste
- 2022-05-24 SQL?Server表空間碎片化回收的實現_MsSql
- 2022-05-03 Shell內置命令之exit的語法與實例_linux shell
- 2022-04-30 DataGridView實現點擊列頭升序和降序排序_C#教程
- 2022-06-23 C++11中模板隱式實例化與顯式實例化的定義詳解分析_C 語言
- 2022-05-19 Python學習之異常斷言詳解_python
- 2022-03-25 C++實現希爾排序算法實例_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支