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

【數(shù)據結構】二叉樹的創(chuàng)建和遍歷(先序、中序、后序)

這篇具有很好參考價值的文章主要介紹了【數(shù)據結構】二叉樹的創(chuàng)建和遍歷(先序、中序、后序)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

最近一段時間學習了數(shù)據結構中二叉樹的基本操作,包括二叉樹的結構、二叉樹的創(chuàng)建、遞歸先序中序后序遍歷、非遞歸遍歷等,想著把二叉樹的相關知識和自己的見解放到網上來讓網友看看是否正確,想和網友一起共同交流。

先了解一下二叉樹的三個基本性質:

性質1:在非空二叉樹中,第i層上至多有2i-1個結點(i≧1)。

性質2深度為k的二叉樹至多有2k-1個結點(k≧1) 。

性質3對任何一棵二叉樹,若其葉子結點數(shù)為n0,度為2的結點數(shù)為n2,則n0=n2+1。

二叉樹的存儲也是有兩種方式:順序存儲和鏈式存儲。

這里給出鏈式存儲的定義:包括一個數(shù)據域、一個左孩子、一個右孩子。

typedef int TElemType;
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

?要創(chuàng)建一個二叉樹,可以通過先序遍歷創(chuàng)建二叉樹的方法:

大體過程為:

  1. 輸入根結點,判斷是否為-1(空),若為-1,則二叉樹為空,否則不為空。
  2. 為其動態(tài)內存分配空間,輸入左子節(jié)點,因為是先序遍歷創(chuàng)建,要遵循根、左、右的順序,所以對左子節(jié)點再遞歸調用該函數(shù)直到NULL。
  3. 再輸入右子節(jié)點,同理,用相同的方法對右子節(jié)點遞歸調用該函數(shù)直到NULL。

代碼如下:

void createBiTree(BiTree *t)
{
	//先序遍歷創(chuàng)建二叉樹 
	int e;
	scanf("%d",&e);
	if(e==-1)
		*t=NULL;//二叉樹為空
	else
	{
		*t=(BiTree)malloc(sizeof(BiTNode));//動態(tài)內存分配
		(*t)->data=e;
		printf("請輸入%d的左子節(jié)點的值:",e);
		createBiTree(&(*t)->lchild);
		printf("請輸入%d的右子節(jié)點的值:",e);
		createBiTree(&(*t)->rchild);
	}
}

?創(chuàng)建好一個二叉樹后,就要對他進行遍歷。

先序遍歷:

遞歸:?若二叉樹為空,則遍歷結束;否則

⑴ 訪問根結點;⑵ 先序遍歷左子樹(遞歸調用本算法);⑶ 先序遍歷右子樹(遞歸調用本算法)。

非遞歸:若二叉樹為空,則返回;否則,令p=T;⑴ 訪問p所指向的結點;⑵ q=p->Rchild ,若q不為空,則q進棧;⑶ p=p->Lchild ,若p不為空,轉(1),否則轉(4);⑷? 退棧到p ,轉(1),直到棧空為止。

中序遍歷:

遞歸:若二叉樹為空,則遍歷結束;否則⑴ 中序遍歷左子樹(遞歸調用本算法);⑵ 訪問根結點;⑶ 中序遍歷右子樹(遞歸調用本算法)。

非遞歸:

若二叉樹為空,則返回;否則,令p=T⑴ 若p不為空,p進棧, p=p->Lchild ;⑵ 否則(即p為空),退棧到p,訪問p所指向的結點;⑶ p=p->Rchild ,轉(1);直到??諡橹?。

后序遍歷:

遞歸:??若二叉樹為空,則遍歷結束;否則⑴ 后序遍歷左子樹(遞歸調用本算法);⑵ 后序遍歷右子樹(遞歸調用本算法) ;⑶ 訪問根結點 。

非遞歸:若二叉樹為空,則返回;否則,令p=T;⑴ 第一次經過根結點p,不訪問;p進棧S1 , tag 賦值0,進棧S2,p=p->Lchild 。⑵ 若p不為空,轉(1),否則,取狀態(tài)標志值tag :?⑶ 若tag=0:對棧S1,不訪問,不出棧;修改S2棧頂元素值(tag賦值1) ,取S1棧頂元素的右子樹,即p=S1[top]->Rchild ,轉(1);⑷ 若tag=1:S1退棧,訪問該結點;

直到??諡橹?。

遞歸先序遍歷的代碼如下:

void PreOrderTraverse(BiTree t)
{
	//遞歸先序遍歷 
	if(t!=NULL)
	{
		printf("%d",t->data);
		PreOrderTraverse(t->lchild);
		PreOrderTraverse(t->rchild);
	}
}

?遞歸中序遍歷的代碼如下:

void InOrderTraverse(BiTree t)
{
	//遞歸中序遍歷 
	if(t!=NULL)
	{
		InOrderTraverse(t->lchild);
		printf("%d",t->data);
		InOrderTraverse(t->rchild);
	}
}

遞歸后序遍歷的代碼如下:

void PostOrderTraverse(BiTree t)
{
	//遞歸后序遍歷
	if(t!=NULL)
	{
		PostOrderTraverse(t->lchild);
		PostOrderTraverse(t->rchild);
		printf("%d",t->data);
	} 
}

?整體過程就是這樣,要想實際測試,完整代碼如下:

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 200
typedef int TElemType;
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void createBiTree(BiTree *t)
{
	//先序遍歷創(chuàng)建二叉樹 
	int e;
	scanf("%d",&e);
	if(e==-1)
		*t=NULL;
	else
	{
		*t=(BiTree)malloc(sizeof(BiTNode));
		(*t)->data=e;
		printf("請輸入%d的左子節(jié)點的值:",e);
		createBiTree(&(*t)->lchild);
		printf("請輸入%d的右子節(jié)點的值:",e);
		createBiTree(&(*t)->rchild);
	}
}
void PreOrderTraverse(BiTree t)
{
	//遞歸先序遍歷 
	if(t!=NULL)
	{
		printf("%d",t->data);
		PreOrderTraverse(t->lchild);
		PreOrderTraverse(t->rchild);
	}
}
void InOrderTraverse(BiTree t)
{
	//遞歸中序遍歷 
	if(t!=NULL)
	{
		InOrderTraverse(t->lchild);
		printf("%d",t->data);
		InOrderTraverse(t->rchild);
	}
}
void PostOrderTraverse(BiTree t)
{
	//遞歸后序遍歷
	if(t!=NULL)
	{
		PostOrderTraverse(t->lchild);
		PostOrderTraverse(t->rchild);
		printf("%d",t->data);
	} 
}
void aPreOrderTraverse(BiTree t)
{
	//非遞歸先序遍歷
	BiTree stack[MAXSIZE];
	int top=0;
	if(t==NULL)
		return;
	BiTree p=t;
	while(!(p==NULL&&top==0))
	{
		while(p)
		{
			printf("%d",p->data);//先訪問根結點 
			stack[top]=p;//將p入棧 
			top++;
			p=p->lchild;//p指向左孩子 
		}
		if(top<=0)return;
		else
		{
			top--;
			p=stack[top];
			p=p->rchild;//p指向右孩子 
		}	
	} 
}
int main()
{
	BiTree t;
	printf("請輸入根節(jié)點的值:");
	createBiTree(&t);
	printf("遞歸先序遍歷二叉樹為:");
	PreOrderTraverse(t);
	printf("\n");
	printf("遞歸中序遍歷二叉樹為:");
	InOrderTraverse(t);
	printf("\n");
	printf("遞歸后序遍歷二叉樹為:");
	PostOrderTraverse(t);
	printf("\n"); 
	printf("非遞歸先序遍歷二叉樹為:");
	aPreOrderTraverse(t);
	printf("\n");
}

測試結果如下:

測試的二叉樹為:

二叉樹的創(chuàng)建與遍歷,從文件讀取數(shù)據建立二叉樹,進行該樹的先根、后根和中根遞歸與,數(shù)據結構,數(shù)據結構,算法

?結果為:

二叉樹的創(chuàng)建與遍歷,從文件讀取數(shù)據建立二叉樹,進行該樹的先根、后根和中根遞歸與,數(shù)據結構,數(shù)據結構,算法

如果有不正確或者能夠更好的地方,歡迎大家多多指教!文章來源地址http://www.zghlxwxcb.cn/news/detail-761548.html

到了這里,關于【數(shù)據結構】二叉樹的創(chuàng)建和遍歷(先序、中序、后序)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 數(shù)據結構 | 二叉樹的各種遍歷

    數(shù)據結構 | 二叉樹的各種遍歷

    我們本章來實現(xiàn)二叉樹的這些功能 Tree.h 我們先來幾個簡單的 直接手動個創(chuàng)建即可,很簡單~~ 這里也是很簡單,也可以看做下圖這樣遍歷,或者畫一下遞歸展開圖 我們這里看一下遞歸展開圖 為空就返回0 不是空,是葉子,返回1 不是空,也不是葉子,就遞歸左子樹和右子樹

    2024年02月04日
    瀏覽(24)
  • 數(shù)據結構——二叉樹的遍歷與應用

    數(shù)據結構——二叉樹的遍歷與應用

    目錄 一.前言 二. 二叉樹鏈式結構的實現(xiàn) 2.1 前置說明 2.2 二叉樹的遍歷 2.2.1 前序、中序以及后序遍歷 前序遍歷: 中序遍歷遞歸圖: 后序遍歷: 2.3節(jié)點個數(shù) 2.4葉子節(jié)點個數(shù) 2.5第K層的節(jié)點個數(shù) 2.6 二叉樹查找值為x的節(jié)點 2.7 二叉樹的銷毀 三.結語 ? 大家好久不見,放寒假了咱

    2024年01月19日
    瀏覽(47)
  • 數(shù)據結構與算法-二叉樹的遍歷

    數(shù)據結構與算法-二叉樹的遍歷

    ?? “少年沒有烏托邦,心向遠方自明朗!” 二叉樹的遍歷是按照一定次序訪問二叉樹中的所有結點,且每個結點僅被訪問一次的過程。遍歷線性結構是容易解決的,而二叉樹的結構是非線性結構,需要尋找規(guī)律,使二叉樹的結點排列在一個線性隊列上,便于遍歷。 由二叉樹

    2024年02月08日
    瀏覽(35)
  • 【數(shù)據結構】二叉樹的層序遍歷

    【數(shù)據結構】二叉樹的層序遍歷

    當我們面對一個樹結構時,常常需要對其進行遍歷以獲取其中的節(jié)點信息。其中一種常用的遍歷方式是層序遍歷,也稱為廣度優(yōu)先搜索(BFS)。本篇博客將詳細介紹層序遍歷的原理和實現(xiàn)方法。 層序遍歷以樹的根節(jié)點開始,按照從上到下、從左到右的順序逐層遍歷樹中的節(jié)點

    2024年02月03日
    瀏覽(33)
  • 【數(shù)據結構】二叉樹的三種遍歷

    【數(shù)據結構】二叉樹的三種遍歷

    目錄 一、數(shù)據結構 二、二叉樹 三、如何遍歷二叉樹 數(shù)據結構是計算機科學中用于組織和存儲數(shù)據的方式。它定義了數(shù)據元素之間的關系以及對數(shù)據元素的操作。常見的數(shù)據結構包括數(shù)組、鏈表、棧、隊列、樹、圖等。 數(shù)組是一種線性數(shù)據結構,它使用連續(xù)的內存空間存儲

    2024年02月21日
    瀏覽(21)
  • Java數(shù)據結構——二叉樹的遍歷

    Java數(shù)據結構——二叉樹的遍歷

    ?作者:敲代碼の流川楓 博客主頁:流川楓的博客 專欄:和我一起學java 語錄:Stay hungry stay foolish 工欲善其事必先利其器,給大家介紹一款超牛的斬獲大廠offer利器——??途W 點擊注冊和我一起刷題 文章目錄 1.創(chuàng)建二叉樹 2.二叉樹的三種遍歷方式 3.代碼實現(xiàn)遍歷 前序遍歷

    2024年01月22日
    瀏覽(20)
  • go數(shù)據結構(二叉樹的遍歷)

    go數(shù)據結構(二叉樹的遍歷)

    ? 用數(shù)組來存儲二叉樹如何遍歷的呢? 如果父節(jié)點的數(shù)組下表是i,那么它的左孩子就是i * 2 + 1,右孩子就是 i * 2 + 2。 ?二叉樹的遍歷方式: 二叉樹有 三種基本遍歷方式 ,分別是 前序遍歷、中序遍歷和后序遍歷 。遍歷的原理是從根節(jié)點開始,按照特定方式遞歸遍歷左子樹

    2023年04月15日
    瀏覽(22)
  • 數(shù)據結構——二叉樹的遍歷【前序、中序、后序】

    數(shù)據結構——二叉樹的遍歷【前序、中序、后序】

    hello hello~ ,這里是大耳朵土土垚~???? ,歡迎大家點贊????關注????收藏?????? ?? 個人主頁:大耳朵土土垚的博客 ?? 所屬專欄:數(shù)據結構學習筆記 、C語言系列函數(shù)實現(xiàn) ??對于數(shù)據結構順序表、鏈表、堆有疑問的都可以在上面數(shù)據結構的專欄進行學習哦~ 有問題可

    2024年03月15日
    瀏覽(30)
  • 【數(shù)據結構】二叉樹的鏈式實現(xiàn)及遍歷

    【數(shù)據結構】二叉樹的鏈式實現(xiàn)及遍歷

    后文所有代碼中的二叉樹結點: 前,中,后序遍歷都可以采用分治遞歸的思想解決,將根節(jié)點和它的孩子結點分別處理。 此處僅利用遞歸展開圖分析前序遍歷,中序和后序也是相同的思想: 層序遍歷需要利用隊列來進行,如果二叉樹跟結點不為空,則讓 指向它的一個指針入

    2024年02月07日
    瀏覽(24)
  • 【數(shù)據結構】二叉樹的層序遍歷(四)

    【數(shù)據結構】二叉樹的層序遍歷(四)

    ?目錄 一,層序遍歷概念 二,層序遍歷的實現(xiàn) ? ? ? ? 1,層序遍歷的實現(xiàn)思路 ????????2,創(chuàng)建隊列 ????????Queue.h ????????Queue.c ????????3,創(chuàng)建二叉樹 ????????BTree.h ????????BTree.c ????????4,層序遍歷的實現(xiàn) 層序遍歷:除了先序遍歷、中序遍歷、

    2024年02月07日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領取紅包

二維碼2

領紅包