最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言之二叉樹的遍歷

 更新時間:2023年03月31日 16:44:24   作者:花想云  
這篇文章主要介紹了C語言中二叉樹的遍歷:前序、中序、后序,認識二叉樹結構最簡單的方式就是遍歷二叉樹,感興趣的小伙伴可以參考閱讀本文

0.寫在前面

認識二叉樹結構最簡單的方式就是遍歷二叉樹。所謂遍歷二叉樹就是按照某種特定的規(guī)則,對二叉樹的每一個節(jié)點進行訪問,且每個節(jié)點只訪問一次。

二叉樹遍歷的規(guī)則一般有四種:前序遍歷、中序遍歷、后序遍歷和層序遍歷。其中,前三種較為簡單且實現(xiàn)方式大同小異。

1.前序遍歷:先訪問根節(jié)點,再遍歷左右子樹;

2.中序遍歷:先遍歷左子樹,再訪問根節(jié)點,再遍歷右子樹;

3.后序遍歷:先遍歷左子樹,再遍歷右子樹,再訪問根節(jié)點。

簡單記憶:前(根,左,右)、中(左,根,右)、后(左,右,根)。

在遍歷二叉樹之前,首先得擁有一棵二叉樹。因為目前還沒有學習如何構建二叉樹,所以此處我們用最原始的辦法——申請N個節(jié)點,將它們手動拼接為二叉樹。

typedef int BTDataType;
 
//二叉樹節(jié)點的結構
typedef struct BTNode
{
	BTDataType data;
	struct BTNode* left;
	struct BTNode* right;
}BTNode;
 
//定義一個申請新節(jié)點的函數(shù)
BTNode* BuyBTNode(BTDataType data)
{
	BTNode* newNode = (BTNode*)malloc(sizeof(BTNode));
	if (newNode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
 
	newNode->data = data;
	newNode->left = NULL;
	newNode->right = NULL;
 
	return newNode;
 }
 
int main()
{
	//手動申請節(jié)點加連接
	BTNode* n1 = BuyBTNode(1);
	BTNode* n2 = BuyBTNode(2);
	BTNode* n3 = BuyBTNode(3);
	BTNode* n4 = BuyBTNode(4);
	BTNode* n5 = BuyBTNode(5);
	BTNode* n6 = BuyBTNode(6);
 
	n1->left = n2;
	n1->right = n4;
	n2->left = n3;
	n4->left = n5;
	n4->right = n6;
	return 0;
}

1.前序遍歷

前序遍歷:先訪問根節(jié)點,再訪問左子樹,再訪問右子樹;

void PrevOrder (BTNode* root)

為了更好的理解前序遍歷的規(guī)則,接下來展示一下詳細步驟。

步驟詳解

1.先訪問根節(jié)點 (data = 1),再訪問左子樹;

2.再訪問左子樹的根節(jié)點(data =  2),再訪問左子樹的左子樹;

3.依舊先訪問根節(jié)點(data = 3),此時 n3 節(jié)點的左右子樹都為 NULL ,則不再往下遞歸,回到上一層;接著訪問上一層的右子樹;

4.因為 n2 節(jié)點的右子樹為 NULL,所以繼續(xù)返回上一層;訪問上一層的右子樹;

5.訪問右子樹的根節(jié)點(data = 4),再訪問右子樹的左子樹;先左子樹的根節(jié)點(data = 5),n5 節(jié)點的左右子樹都為 NULL,返回上一層訪問右子樹(data = 6),同樣 n6 節(jié)點的左右子樹都為 NULL,返回上一層。

至此每個節(jié)點都訪問完畢,總體的訪問順序是這樣的:

按照訪問順序打印的結果應該是(空節(jié)點用 NULL 表示):

代碼實現(xiàn)

按照前序遍歷的邏輯,前序遍歷的實現(xiàn)肯定是離不開遞歸。

void PrevOrder(BTNode* root)
{
	if (root == NULL)
	{ 
		printf("NULL ");//空節(jié)點用 NULL 表示
		return; 
	}
 
	printf("%d ", root->data);//前序在前
	PrevOrder(root->left);
	PrevOrder(root->right);
}

運行程序,看結果是否與之前推理的結果一致:

int main()
{
	//手動申請節(jié)點加連接
	BTNode* n1 = BuyBTNode(1);
	BTNode* n2 = BuyBTNode(2);
	BTNode* n3 = BuyBTNode(3);
	BTNode* n4 = BuyBTNode(4);
	BTNode* n5 = BuyBTNode(5);
	BTNode* n6 = BuyBTNode(6);
 
	n1->left = n2;
	n1->right = n4;
	n2->left = n3;
	n4->left = n5;
	n4->right = n6;
 
	PrevOrder(n1);
	return 0;
}

2.中序遍歷

前中后序三種遍歷大同小異,實現(xiàn)代碼也幾乎相同。

void InOrder(BTNode* root)

步驟詳解

代碼實現(xiàn)

void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
 
	PrevOrder(root->left);
	printf("%d ", root->data);//中序在中
	PrevOrder(root->right);
}

3.后序遍歷

步驟詳解

參考1、2。

代碼實現(xiàn)

void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
 
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->data);//后序在后
}

 到此這篇關于C語言之二叉樹的遍歷的文章就介紹到這了,更多相關二叉樹的遍歷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解析bitmap處理海量數(shù)據(jù)及其實現(xiàn)方法分析

    解析bitmap處理海量數(shù)據(jù)及其實現(xiàn)方法分析

    本篇文章是對bitmap處理海量數(shù)據(jù)及其實現(xiàn)的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++11新特性之右值引用與完美轉發(fā)詳解

    C++11新特性之右值引用與完美轉發(fā)詳解

    C++11標準為C++引入右值引用語法的同時,還解決了一個短板,即使用簡單的方式即可在函數(shù)模板中實現(xiàn)參數(shù)的完美轉發(fā)。本文就來講講二者的應用,需要的可以參考一下
    2022-09-09
  • C++缺省參數(shù)、函數(shù)重載與引用深入解析

    C++缺省參數(shù)、函數(shù)重載與引用深入解析

    缺省參數(shù)函數(shù)重載以及引用的出現(xiàn)是為了補充C語言語法的不足以及對C語言設計不合理的地方進行優(yōu)化,引用的出現(xiàn)大大降低了我們學習C語言時相對于指針的難度,也便于我們更好的理解和使用,感興趣的朋友一起看看吧
    2024-04-04
  • C++實現(xiàn)大數(shù)乘法算法代碼

    C++實現(xiàn)大數(shù)乘法算法代碼

    這篇文章主要介紹了C++實現(xiàn)大數(shù)乘法算法代碼的相關資料,需要的朋友可以參考下
    2015-03-03
  • C++文件的操作及小實驗示例代碼詳解

    C++文件的操作及小實驗示例代碼詳解

    這篇文章主要介紹了C++文件的操作及小實驗,對于文件,它是一個流對象,對文件的操作無非是讀和寫,通過本文的學習大家將會理解文件的具體操作
    2022-05-05
  • C語言寫一個散列表

    C語言寫一個散列表

    這篇文章主要介紹了C語言寫一個散列表,散列表,就是下標可以為字母的數(shù)組。更多內(nèi)容和小編一起學習下面內(nèi)容吧
    2022-01-01
  • 關于VS2019 C++項目同時出現(xiàn)LNK2005 和LNK1169 error 的解決辦法

    關于VS2019 C++項目同時出現(xiàn)LNK2005 和LNK1169 error 的解決辦法

    這篇文章主要介紹了關于VS2019 C++項目同時出現(xiàn)LNK2005 和LNK1169 error 的解決辦法,本文給大家介紹的非常詳細,對大家的學習工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • C++基礎 class、struct、union詳細

    C++基礎 class、struct、union詳細

    這篇文章主要 給大家介紹的是C++基礎 class、struct、union,主要由三部分組成,分別是、類class、結構體struct、共用體union,需要的朋友可以參考一下
    2021-09-09
  • C++編程中的格式化輸出詳解

    C++編程中的格式化輸出詳解

    這篇文章主要介紹了C++編程中的格式化輸出詳解,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • C++中string替換所有指定字符串的方法

    C++中string替換所有指定字符串的方法

    這篇文章主要介紹了C++中string替換所有指定字符串的實例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05

最新評論

波密县| 凤山县| 嘉荫县| 丰城市| 周宁县| 渭南市| 永顺县| 游戏| 庐江县| 榆中县| 汉川市| 那曲县| 江阴市| 宽城| 长乐市| 房产| 囊谦县| 临猗县| 建平县| 上高县| 霞浦县| 芜湖市| 当涂县| 泰兴市| 宁海县| 西平县| 宁陵县| 红安县| 兴化市| 高唐县| 施甸县| 隆昌县| 民权县| 广德县| 宽城| 新丰县| 延津县| 河津市| 沿河| 泾源县| 彰化市|