二叉樹鏈式結構的前序_中序_后續_層序遍歷【詳細圖解】

P. S.:以下代碼均在VS2019環境下測試,不代表所有編譯器均可通過。
P. S.:測試代碼均未展示頭文件stdio.h的聲明,使用時請自行添加。

??

在這里插入圖片描述

???????????????????????????????????????????博主主頁:LiUEEEEE
??????????????????? ??????????????????????????C語言專欄
????????????????????????????????????????????數據結構專欄
?????????????????????????????????????????力扣牛客經典題目專欄

目錄

  • 1、前言
  • 2、前序遍歷
  • 3、中序遍歷
  • 4、后序遍歷
  • 5、層序遍歷
  • 6、完整代碼展示
  • 7、結語

1、前言


??有關二叉樹鏈式結構的四種遍歷方式,是基于二叉樹由鏈式結構組成,故本文不再講解如何實現二叉樹的鏈式結構,以手搓鏈式結構的方式進行四種遍歷方式的講解。
  • 結點結構及相關定義展示:
typedef int TreeDataType;typedef struct TreeNode
{TreeDataType val;struct TreeNode* left;struct TreeNode* right;
}TNode;TNode* BuyNode(TreeDataType x);創建二叉樹結點TNode* CreateTree();串連結點組成樹
  • BuyNode
TNode* BuyNode(TreeDataType x)
{TNode* tmp = (TNode*)malloc(sizeof(TNode));if (tmp == NULL){perror("BuyNode: malloc fail");return NULL;}tmp->val = x;tmp->left = tmp->right = NULL;return tmp;
}
  • CreateTree
TNode* CreateTree()
{TNode* node1 = BuyNode(1);TNode* node2 = BuyNode(2);TNode* node3 = BuyNode(3);TNode* node4 = BuyNode(4);TNode* node5 = BuyNode(5);TNode* node6 = BuyNode(6);node1->left = node2;node1->right = node3;node2->left = node4;node2->right = node5;node3->left = node6;return node1;
}

??再此基礎上我們所構建的書邏輯圖如下所示:
在這里插入圖片描述
PS.圖中子樹未連接部分均為NULL。




2、前序遍歷


??遍歷的命名規則為,以每一顆樹的根為主要節點(整個樹的根以及子樹的根),以根出現的次序進行命名,下文中的中序后續皆可以此理解。
??前序遍歷:遍歷的順序依次為:根,左子樹,右子樹。
??例如上文中我們手搓的二叉樹,通過前序遍歷的過程并打印的結果如下圖所示:

在這里插入圖片描述

  • 前序遍歷代碼實現
void PreOrder(TNode* root)
{if (root == NULL)return;printf("%d ", root->val);PreOrder(root->left);PreOrder(root->right);
}




3、中序遍歷


??中序遍歷:遍歷的順序依次為:左子樹,根,右子樹。
??例如上文中我們手搓的二叉樹,通過中序遍歷的過程并打印的結果如下圖所示:

在這里插入圖片描述

  • 中序遍歷代碼實現
void InOrder(TNode* root)
{if (root == NULL)return;InOrder(root->left);printf("%d ", root->val);InOrder(root->right);
}




4、后序遍歷


??后序遍歷:遍歷的順序依次為:左子樹,右子樹,根。
??例如上文中我們手搓的二叉樹,通過后序遍歷的過程并打印的結果如下圖所示:

在這里插入圖片描述

  • 后序遍歷代碼實現
void PostOrder(TNode* root)
{if (root == NULL)return;PostOrder(root->left);PostOrder(root->right);printf("%d ", root->val);
}




5、層序遍歷


??層序遍歷是指按照層數從每層的最左側向右依次打印二叉樹的節點值,如下圖所示:

在這里插入圖片描述


??但我們實際中很難使用遞歸來操作,使得再打印完2時,通過結點1找到結點3的值打印,故我們需要借助其他工具進行實現,即隊列。


??操作原則是,先將根結點1輸入到隊列中,在打印根結點1時,將結點1的左結點與右結點依次輸入進隊列,并將結點1從隊列中刪除,以此往復,直至在隊列中遇見空結點。
??對此本文不再對隊列相關的知識進行講解,如有需要回看博文:

???????????????????? 隊列的實現(使用鏈表)


??邏輯思路如下圖所示:

在這里插入圖片描述

  • 層序遍歷代碼實現
void LevelOrder(TNode* root)
{Queue pq;QueueInit(&pq);if (root)QueuePush(&pq, root);while (!QueueEmpty(&pq)){TNode* front = QueueFront(&pq);QueuePop(&pq);printf("%d ", front->val);if (front->left)QueuePush(&pq, front->left);if (front->right)QueuePush(&pq, front->right);}QueueDestroy(&pq);
}
  • 四種遍歷方式結果展示
    在這里插入圖片描述




6、完整代碼展示


?? P,S.本章節所展示代碼不包含隊列代碼,如有需求請自行添加。
  • Tree.h
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>typedef int TreeDataType;typedef struct TreeNode
{TreeDataType val;struct TreeNode* left;struct TreeNode* right;
}TNode;TNode* BuyNode(TreeDataType x);TNode* CreateTree();void PreOrder(TNode* root);void InOrder(TNode* root);void PostOrder(TNode* root);void LevelOrder(TNode* root);
  • Tree.c
#include "Tree.h"
#include "Queue.h"TNode* BuyNode(TreeDataType x)
{TNode* tmp = (TNode*)malloc(sizeof(TNode));if (tmp == NULL){perror("BuyNode: malloc fail");return NULL;}tmp->val = x;tmp->left = tmp->right = NULL;return tmp;
}TNode* CreateTree()
{TNode* node1 = BuyNode(1);TNode* node2 = BuyNode(2);TNode* node3 = BuyNode(3);TNode* node4 = BuyNode(4);TNode* node5 = BuyNode(5);TNode* node6 = BuyNode(6);node1->left = node2;node1->right = node3;node2->left = node4;node2->right = node5;node3->left = node6;return node1;
}void PreOrder(TNode* root)
{if (root == NULL)return;printf("%d ", root->val);PreOrder(root->left);PreOrder(root->right);
}void InOrder(TNode* root)
{if (root == NULL)return;InOrder(root->left);printf("%d ", root->val);InOrder(root->right);
}void PostOrder(TNode* root)
{if (root == NULL)return;PostOrder(root->left);PostOrder(root->right);printf("%d ", root->val);
}void LevelOrder(TNode* root)
{Queue pq;QueueInit(&pq);if (root)QueuePush(&pq, root);while (!QueueEmpty(&pq)){TNode* front = QueueFront(&pq);QueuePop(&pq);printf("%d ", front->val);if (front->left)QueuePush(&pq, front->left);if (front->right)QueuePush(&pq, front->right);}QueueDestroy(&pq);
}
  • TreeTest.c
#include "Tree.h"void test()
{TNode* root = CreateTree();printf("前序遍歷結果:");PreOrder(root);printf("\n");printf("中序遍歷結果:");InOrder(root);printf("\n");printf("后序遍歷結果:");PostOrder(root);printf("\n");printf("層序遍歷結果:");LevelOrder(root);printf("\n");
}int main()
{test();return 0;
}




7、結語


在這里插入圖片描述

??十分感謝您觀看我的原創文章。
??本文主要用于個人學習和知識分享,學習路漫漫,如有錯誤,感謝指正。
??如需引用,注明地址。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19406.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19406.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19406.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Excel 導入

依賴 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency> service 讀取excel文件的行數據 DataExcelListener<DeviceTemplateExcel> listener new…

MFC CList<CRect, CRect> m_listRect;的用法

CList<CRect, CRect&> 是 MFC&#xff08;Microsoft Foundation Classes&#xff09;中定義的一個雙向鏈表模板類&#xff0c;用于存儲 CRect 對象。在使用 CList 時&#xff0c;你可以執行多種操作&#xff0c;比如添加、移除、查找和遍歷元素。以下是一些常見的用法…

SAP 生產訂單報工函數BAPI_PRODORDCONF_CREATE_TT不返回報錯信息

最近財務一直反饋MES報工的數據都沒有成本,然后去查看原因發現是財務當月的KP26的價格沒有進行維護,導致沒有收集到工單的報工成本。 但是在前臺操作CO11 報工的時候,系統會給出報錯的信息 但是我們在調用函數BAPI_PRODORDCONF_CREATE_TT的時候,系統并沒有返回報錯的信息…

普通測徑儀和智能測徑儀的五大區別

在工業自動化和精密測量的領域中&#xff0c;測徑儀是不可或缺的重要工具。隨著科技的進步&#xff0c;測徑儀也在不斷地進行技術革新和升級&#xff0c;從傳統的普通測徑儀發展到如今的智能測徑儀。本文將詳細探討普通測徑儀與智能測徑儀之間的五大區別。 一、測量精度與穩定…

【Tlias智能學習輔助系統】01 準備工作

Tlias智能學習輔助系統 01 創建員工、部門表創建springboot工程&#xff0c;引入對應的起步依賴(web、mybatis、mysql驅動、lombok)準備 Mapper、Service、Controller 等基礎結構MapperServiceControllerpojo封裝類application.properties 接口開發規范 創建員工、部門表 -- 創…

oracle sql--計算某一日期到當前日期的間隔天數

oracle sql–計算某一日期到當前日期的間隔天數 如題&#xff0c;是在工作中遇到的一個報表需求問題。用戶需要查詢“創建時間到當下的天數”&#xff0c;于是我這個可憐的打工仔就開始干活了。。。&#xff08;苦澀ing&#xff09;我發現oracle sql的自帶函數和普通的sql貌似…

FPGA基礎:觸發器和鎖存器

目錄 鎖存器&#xff08;Latch&#xff09;D觸發器&#xff08;Flip-Flop&#xff09;最基本時序電路時序塊&#xff08;Sequential blocks&#xff09;:同步與異步觸發器概念觸發器分類觸發器的Verilog實現1. 上升沿觸發的觸發器2. 帶異步復位、上升沿觸發的觸發器3. 帶異步復…

raid配置與實戰10

一、raid理論 1、raid概述 raid&#xff08;磁盤陣列&#xff09;&#xff1a;是用不同的硬盤分區&#xff0c;組成一個邏輯上的硬盤&#xff0c;高可用&#xff08;冗余&#xff09;。 2、raid級別 2.1、raid0條帶化存儲 數據分散在多個物理磁盤上的存儲方式&#xff0c;…

新媒體時代,LCD電子價簽賦予零售場景新活力

近年來&#xff0c;全球企業迅速掀起了數字化轉型的浪潮&#xff0c;加速了新零售科技的發展與應用。在實體零售門店中&#xff0c;商品貨架顯示逐漸趨向智能化和多樣化。然而&#xff0c;在信息傳播日益碎片化和視頻化的時代&#xff0c;零售門店如何更有效地吸引消費者的注意…

英飛凌 AURIX TriCore 單片機開發入門

文章目錄 目的硬件準備AURIX? Development StudioInfineon MemtoolAURIX? iLLD Drivers總結 目的 英飛凌的32位 AURIX? TriCore? 系列單片機 經常用于汽車和工業領域。開發該系列單片機比較常用的開發環境有 HighTec 和 AURIX? Development Studio 。本文將基于后者&…

TalkingData數據統計的力量

在數字化時代&#xff0c;數據已成為企業競爭的關鍵資源。而TalkingData作為一家領先的第三方數據平臺&#xff0c;其數據統計能力無疑是推動企業智能化轉型的重要力量。 首先&#xff0c;TalkingData的數據統計能力體現在其龐大的用戶基礎和豐富的數據來源上。通過與數千家應…

Java-常用模塊

文章目錄 日期時間stream流 日期時間 jdk8新的日期時間類 解析和格式化DateTimeFormatter類&#xff08;線程安全&#xff09; LocalDateTime類 Instant類 Duration類String time "2013-02-11 11:00:00";DateTimeFormatter dateTimeFormatter DateTimeFormatter.o…

linux鏡像虛擬機創建共享文件夾詳細步驟 -- 和本地電腦傳輸文件

主機與虛擬機之間傳遞文件&#xff0c;最快捷的方法莫過于共享文件夾。此方法不需要復制文件&#xff0c;而且可以節省硬盤空間。 具體設置步驟如下&#xff1a; 打開自己的電腦&#xff0c;創建共享的文件夾&#xff0c;完成后鼠標右擊剛剛創建的共享文件夾&#xff0c;選擇…

設計模式 18 迭代器模式 Iterator Pattern

設計模式 18 迭代器模式 Iterator Pattern 1.定義 迭代器模式 (Iterator Pattern) 是一種行為型設計模式&#xff0c;它提供了一種訪問集合元素的標準方法&#xff0c;而無需暴露集合的內部表示。 提供一種方法順序訪問一個聚合對象中的各個元素&#xff0c;而又不需要暴露該…

python猜數游戲限制次數

1、游戲規則 在這個游戲中&#xff0c;計算機會隨機生成一個1到100之間的整數&#xff0c;玩家需要在限定的次數內猜測這個數字是多少。如果玩家猜對了數字&#xff0c;游戲結束&#xff0c;玩家獲勝;如果玩家用完了所有的猜測次數仍然沒有猜對&#xff0c;游戲結束&#xff0…

Redis之內存管理過期、淘汰機制

1.Redis內存管理 我們的redis是一個內存型數據庫&#xff0c;我們的數據也都是放在內存中的&#xff0c;內存是有限的空間&#xff0c;當數據滿了之后&#xff0c;我們要怎么樣繼續保證redis的可用性呢?我們就需要采取點管理措施和機制來保證我們redis的可用性。 在redis.co…

一套saas模式云MES系統源碼,基于springboot+vue.js+uniapp開發

一套saas模式云MES系統源碼&#xff0c;基于springbootvue.jsuniapp開發 MES系統簡介 MES系統&#xff0c;即制造執行系統&#xff08;Manufacturing Execution System&#xff09;&#xff0c;是一種面向制造企業車間執行層的生產信息化管理系統。它位于上層的企業資源規劃&a…

Day01_CET4-Read synonymous substitutions

文章目錄 1.減少2.增加3.原因4.贊揚 1.減少 diminish v.減少 dwindle v.逐漸減少 lessen v.減少 slash v.削減 &#xff08;cut down&#xff09; slump v.暴跌&#xff1b;n.衰退 recession n.衰退 &#xff08;economic disruption&#xff09; lower v.降低 depress…

應用案例|精密制造中使用復合機器人得到顯著提升

精密制造行業對設備的精度、穩定性和效率要求極高&#xff0c;而復合機器人憑借其多功能性、高度靈活性和精準控制能力&#xff0c;正逐漸成為該領域的新寵。以下是一個富唯智能復合機器人在精密制造中的應用案例。 案例背景 某知名汽車零部件制造企業&#xff0c;專注于生產…

【JS】并發控制

需求 控制網絡請求并發數控制并發按順序返回結果 碼 /** * 控制并發 * param {Function} fn 邏輯處理函數 * param {Array} arr 發送的數據 * param {Number} [max3] 并發數 默認3 * param {Number} [orderfalse] 按順序返回執行結果 默認false * param {Number} [retry1] 重試…