国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu)】深入探討二叉樹的遍歷和分治思想(一)

這篇具有很好參考價(jià)值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】深入探討二叉樹的遍歷和分治思想(一)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??紙上得來終覺淺, 絕知此事要躬行。
??主頁:June-Frost
??專欄:數(shù)據(jù)結(jié)構(gòu)

【數(shù)據(jù)結(jié)構(gòu)】深入探討二叉樹的遍歷和分治思想(一),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,分治,二叉樹的遍歷

??該文章主要講述二叉樹的遞歸結(jié)構(gòu)及分治算法的思想。

??前言:

?為了實(shí)現(xiàn)二叉樹的基本操作以及更好的了解二叉樹的結(jié)構(gòu),先手動(dòng)創(chuàng)造一個(gè)鏈?zhǔn)蕉鏄洹?/p>

#include<stdio.h>
#include<stdlib.h>

typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
	int val;
}BTNode;

BTNode* BuyNode(int x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	node->left = NULL;
	node->right = NULL;
	node->val = x;
	return node;
}
int main()
{
	//創(chuàng)建節(jié)點(diǎn)
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);
	BTNode* node7 = BuyNode(7);
	//建立關(guān)系
	node1->left = node2;
	node1->right = node3;
	node2->left = node4;
	node3->left = node5;
	node3->right = node6;
	node4->right = node7;

	return 0;
}

?創(chuàng)建出來的結(jié)構(gòu):
【數(shù)據(jù)結(jié)構(gòu)】深入探討二叉樹的遍歷和分治思想(一),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,分治,二叉樹的遍歷
??創(chuàng)建出來的這棵二叉樹將為后續(xù)的遍歷和分治做準(zhǔn)備.

?? 二叉樹的遍歷

? 遍歷操作可以快速熟悉二叉樹的遞歸結(jié)構(gòu),二叉樹遍歷(Traversal)是按照某種特定的規(guī)則,依次對(duì)二叉樹中的節(jié)點(diǎn)進(jìn)行相應(yīng)的操作,并且每個(gè)節(jié)點(diǎn)只操作一次。訪問結(jié)點(diǎn)所做的操作依賴于具體的應(yīng)用問題。 遍歷是二叉樹上最重要的運(yùn)算之一,也是二叉樹上進(jìn)行其它運(yùn)算的基礎(chǔ)。

?如果二叉樹不為空樹,就需要看成三部分,即 根節(jié)點(diǎn),根節(jié)點(diǎn)的左子樹、根節(jié)點(diǎn)的右子樹,這樣就滿足了遞歸結(jié)構(gòu):【數(shù)據(jù)結(jié)構(gòu)】深入探討二叉樹的遍歷和分治思想(一),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,分治,二叉樹的遍歷

??由于二叉樹滿足遞歸結(jié)構(gòu),所以按照規(guī)則,二叉樹的遍歷有:前序/中序/后序的遞歸結(jié)構(gòu)遍歷:

  • 前序遍歷(Preorder Traversal 亦稱先序遍歷)——訪問根結(jié)點(diǎn)的操作發(fā)生在遍歷其左右子樹之前。即順序?yàn)椋焊?、左子樹、右子樹。

  • 中序遍歷(Inorder Traversal)——訪問根結(jié)點(diǎn)的操作發(fā)生在遍歷其左右子樹之中(間)。即順序?yàn)椋鹤笞訕洹⒂易訕?、根?/p>

  • 后序遍歷(Postorder Traversal)——訪問根結(jié)點(diǎn)的操作發(fā)生在遍歷其左右子樹之后。即順序?yàn)椋鹤笞訕?、右子樹、根?/p>

??按照創(chuàng)建的二叉樹,遍歷的順序?yàn)椋?br>【數(shù)據(jù)結(jié)構(gòu)】深入探討二叉樹的遍歷和分治思想(一),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,分治,二叉樹的遍歷


?? 前序遍歷

代碼實(shí)現(xiàn):

void PreOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	printf("%d ", root->val);
	PreOrder(root->left);
	PreOrder(root->right);
}

動(dòng)圖展示:
【數(shù)據(jù)結(jié)構(gòu)】深入探討二叉樹的遍歷和分治思想(一),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,分治,二叉樹的遍歷

前序遍歷遞歸圖解:
【數(shù)據(jù)結(jié)構(gòu)】深入探討二叉樹的遍歷和分治思想(一),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,分治,二叉樹的遍歷


?? 中序遍歷

代碼實(shí)現(xiàn):

void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	InOrder(root->left);
	printf("%d ", root->val);
	InOrder(root->right);
}

動(dòng)圖展示:

【數(shù)據(jù)結(jié)構(gòu)】深入探討二叉樹的遍歷和分治思想(一),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,分治,二叉樹的遍歷
? 注意:對(duì)于這個(gè)動(dòng)圖的白色箭頭為遞歸調(diào)用和結(jié)束,紅色箭頭是左子樹部分調(diào)用結(jié)束之后打印節(jié)點(diǎn)的時(shí)機(jī)。

?? 后續(xù)遍歷

代碼實(shí)現(xiàn):

void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->val);
}

動(dòng)圖展示:
【數(shù)據(jù)結(jié)構(gòu)】深入探討二叉樹的遍歷和分治思想(一),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,分治,二叉樹的遍歷

? 注意:對(duì)于這個(gè)動(dòng)圖的白色箭頭為遞歸調(diào)用和結(jié)束,紅色箭頭是右子樹部分調(diào)用結(jié)束之后打印節(jié)點(diǎn)的時(shí)機(jī)。


?? 分治

?分治思想是一種解決問題的方法,本質(zhì)是一種管理,它的核心思想是將一個(gè)復(fù)雜的問題分解成若干個(gè)較小的子問題,然后分別解決這些子問題,最后將子問題的解合并得到原問題的解。這種思想在計(jì)算機(jī)科學(xué)、數(shù)學(xué)和工程領(lǐng)域都有廣泛應(yīng)用。
?分治思想的優(yōu)點(diǎn)在于它可以有效地減少問題的復(fù)雜度,提高算法的效率。同時(shí),它還可以提高代碼的可讀性和可維護(hù)性,因?yàn)榭梢詫栴}分解成更小的部分,更容易理解和修改。

?? 一些例子

二叉樹的節(jié)點(diǎn)個(gè)數(shù)

【數(shù)據(jù)結(jié)構(gòu)】深入探討二叉樹的遍歷和分治思想(一),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,分治,二叉樹的遍歷

節(jié)點(diǎn)情況:

  • 如果是空節(jié)點(diǎn),返回0。
  • 如果不是空節(jié)點(diǎn),則返回該節(jié)點(diǎn)的左子樹的節(jié)點(diǎn)數(shù)+右子樹的節(jié)點(diǎn)個(gè)數(shù)+1(自己這個(gè)節(jié)點(diǎn))。
int BinaryTreeSize(BTNode* root)
{
	return root == NULL ? 0 : BinaryTreeSize(root->left) + BinaryTreeSize(root->right) + 1;
}

?這個(gè)代碼的訪問順序其實(shí)就是后序遍歷。

二叉樹葉子節(jié)點(diǎn)個(gè)數(shù)

節(jié)點(diǎn)情況:

  • 如果是空,返回0。
  • 如果是葉子,返回1。
  • 不是葉子也不是空,就返回該節(jié)點(diǎn)左子樹的葉子數(shù) + 右子樹的葉子數(shù)。
int BinaryTreeLeafSize(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	if (root->left == NULL && root->right == NULL)
	{
		return 1;
	}
	return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}

【數(shù)據(jù)結(jié)構(gòu)】深入探討二叉樹的遍歷和分治思想(一),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,分治,二叉樹的遍歷
二叉樹第k層節(jié)點(diǎn)個(gè)數(shù)
【數(shù)據(jù)結(jié)構(gòu)】深入探討二叉樹的遍歷和分治思想(一),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,分治,二叉樹的遍歷

int BinaryTreeLevelKSize(BTNode* root, int k)
{
	if (root == NULL)
	{
		return 0;
	}
	if (k == 1)
	{
		return 1;
	}
	return BinaryTreeLevelKSize(root->left,k-1) + BinaryTreeLevelKSize(root->right, k - 1);
}

?? 結(jié)語

?文章到這里就結(jié)束了,如果對(duì)你有幫助,你的點(diǎn)贊將會(huì)是我的最大動(dòng)力,如果大家有什么問題或者不同的見解,歡迎大家的留言~文章來源地址http://www.zghlxwxcb.cn/news/detail-717896.html

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】深入探討二叉樹的遍歷和分治思想(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹的鏈?zhǔn)浇Y(jié)構(gòu)

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹的鏈?zhǔn)浇Y(jié)構(gòu)

    學(xué)習(xí)鏈?zhǔn)蕉鏄湟廊N遍歷方式,便于對(duì)二叉樹的節(jié)點(diǎn)以及左子樹和右子樹進(jìn)行操作。 前序遍歷:根、左子樹、右子樹 中序遍歷:左子樹、根、右子樹 后序遍歷:左子樹、右子樹、根 以下圖為例: 得到的結(jié)果: 前序遍歷:1 2 3 4 5 6 中序遍歷:3 2 1 5 4 6 后序遍歷:3 2

    2024年02月08日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹的介紹和二叉樹堆

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹的介紹和二叉樹堆

    ??作者簡(jiǎn)介: 加油,旭杏,目前大二,正在學(xué)習(xí) C++ , 數(shù)據(jù)結(jié)構(gòu) 等?? ??作者主頁:加油,旭杏的主頁?? ?本文收錄在:再識(shí)C進(jìn)階的專欄?? ??代碼倉庫:旭日東升 1?? ??歡迎大家點(diǎn)贊 ?? 收藏 ? 加關(guān)注哦!?? ???????樹這一概念,在我們剛開始聽說的時(shí)候會(huì)覺得

    2024年01月20日
    瀏覽(34)
  • 【數(shù)據(jù)結(jié)構(gòu)】樹,二叉樹,滿二叉樹,完全二叉樹的定義和二叉樹的基本操作

    【數(shù)據(jù)結(jié)構(gòu)】樹,二叉樹,滿二叉樹,完全二叉樹的定義和二叉樹的基本操作

    ??專欄【數(shù)據(jù)結(jié)構(gòu)】 ??喜歡的詩句:更喜岷山千里雪 三軍過后盡開顏。 ??音樂分享【勛章】 大一同學(xué)小吉,歡迎并且感謝大家指出我的問題?? 目錄 ?樹 ??????定義 ???????注意 ??樹的基本術(shù)語 ?二叉樹 ??????定義 ??二叉樹和樹的區(qū)別 ??????二叉樹

    2024年02月05日
    瀏覽(85)
  • 數(shù)據(jù)結(jié)構(gòu):二叉樹的順序結(jié)構(gòu)--堆

    數(shù)據(jù)結(jié)構(gòu):二叉樹的順序結(jié)構(gòu)--堆

    朋友們、伙計(jì)們,我們又見面了,本期來給大家解讀一下二叉樹--堆的相關(guān)知識(shí)點(diǎn),如果看完之后對(duì)你有一定的啟發(fā),那么請(qǐng)留下你的三連,祝大家心想事成! C 語 言 專 欄:C語言:從入門到精通 數(shù)據(jù)結(jié)構(gòu)專欄:數(shù)據(jù)結(jié)構(gòu) 個(gè)? 人? 主? 頁 :stackY、 目錄 前言: 1.堆的概念及

    2024年02月06日
    瀏覽(28)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹的順序結(jié)構(gòu)-堆

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹的順序結(jié)構(gòu)-堆

    普通的二叉樹是不適合用數(shù)組來存儲(chǔ)的,因?yàn)榭赡軙?huì)存在大量的空間浪費(fèi)。而 完全二叉樹 更適合使用順序結(jié)構(gòu)存儲(chǔ)。 現(xiàn)實(shí)中我們通常把堆(一種二叉樹)使用順序結(jié)構(gòu)的數(shù)組來存儲(chǔ),需要注意的是這里的堆和操作系統(tǒng)虛擬進(jìn)程地址空間中的堆是兩回事,一個(gè)是數(shù)據(jù)結(jié)構(gòu),一個(gè)

    2024年02月09日
    瀏覽(29)
  • 【數(shù)據(jù)結(jié)構(gòu)—二叉樹的鏈?zhǔn)浇Y(jié)構(gòu)實(shí)現(xiàn)】

    【數(shù)據(jù)結(jié)構(gòu)—二叉樹的鏈?zhǔn)浇Y(jié)構(gòu)實(shí)現(xiàn)】

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 文章目錄 前言 一、二叉樹的存儲(chǔ)結(jié)構(gòu) 二、二叉樹鏈?zhǔn)浇Y(jié)構(gòu)的實(shí)現(xiàn) 2.1手動(dòng)構(gòu)建一課樹 2.2二叉樹的遍歷 三、二叉樹鏈?zhǔn)浇Y(jié)構(gòu)的實(shí)現(xiàn) 3.1前序遍歷(遞歸) 3.2中序遍歷(遞歸) 3.3后序遍歷(遞歸) 3.4層序遍歷(非遞

    2024年02月03日
    瀏覽(24)
  • 【數(shù)據(jù)結(jié)構(gòu) —— 二叉樹的鏈?zhǔn)浇Y(jié)構(gòu)實(shí)現(xiàn)】

    【數(shù)據(jù)結(jié)構(gòu) —— 二叉樹的鏈?zhǔn)浇Y(jié)構(gòu)實(shí)現(xiàn)】

    樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n=0)個(gè)有限結(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合。 把它叫做樹是因?yàn)樗雌饋硐褚豢玫箳斓臉?,也就是說它是根朝上,而葉朝下的。 1.有一個(gè) 特殊的結(jié)點(diǎn),稱為根結(jié)點(diǎn) ,根節(jié)點(diǎn)沒有前驅(qū)結(jié)點(diǎn) 2.除根節(jié)點(diǎn)外, 其余結(jié)點(diǎn)被分成M(M0)個(gè)互不相交

    2024年02月05日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹的概念及結(jié)構(gòu)

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹的概念及結(jié)構(gòu)

    ??write in front?? ??所屬專欄: 初階數(shù)據(jù)結(jié)構(gòu) ???博客主頁:睿睿的博客主頁 ???代碼倉庫:??VS2022_C語言倉庫 ??您的點(diǎn)贊、關(guān)注、收藏、評(píng)論,是對(duì)我最大的激勵(lì)和支持?。?! 關(guān)注我,關(guān)注我,關(guān)注我 , 你們將會(huì)看到更多的優(yōu)質(zhì)內(nèi)容??! 樹是一種 非線性的數(shù)據(jù)結(jié)構(gòu)

    2023年04月23日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)

    前序遍歷,又叫先根遍歷。 遍歷順序:根 - 左子樹 - 右子樹 代碼: 中序遍歷,又叫中根遍歷。 遍歷順序:左子樹 - 根 - 右子樹 代碼 : 后序遍歷,又叫后根遍歷。 遍歷順序:左子樹 - 右子樹 - 根 代碼 : 除了先序遍歷、中序遍歷、后序遍歷外,還可以對(duì)二叉樹進(jìn)行層序遍

    2024年02月09日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)——樹的概念、二叉樹的概念

    數(shù)據(jù)結(jié)構(gòu)——樹的概念、二叉樹的概念

    現(xiàn)在是北京時(shí)間的2023年6月7號(hào)15點(diǎn)28分,剛考完了一課期末考試,回到宿舍就立馬準(zhǔn)備發(fā)布這篇博客。距離完成本周復(fù)習(xí)指標(biāo)還差兩篇博客。加油! 樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n=0)個(gè)有限結(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合。把它叫做樹是因?yàn)樗雌饋硐褚豢玫箳斓?/p>

    2024年02月08日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包