c語言利用遍歷求樹高的程序,用C語言實現二叉樹的遍歷極其應用

用C語言實現二叉樹的遍歷極其應用

[1]〔摘要〕:《數據結構》是計算機系學生的一門專業技術基礎課程,計算機科學各領域及有關的應用軟件都要用到各種數據結構。C語言有較豐富的數據類型、運算符以及函數,能直接與內存打交道,使修改、編輯其他程序與文檔變得簡單,因此用C語言實現的《數據結構》程序越來越得到廣泛應用。樹型結構是一類重要的非線性數據結構,其中以樹和二叉樹最為常用。二叉樹的遍歷算法是樹形結構中其他運算的基礎,在二叉樹遍歷的各種算法中包括了一些精致的,并且在其他應用范圍內也有用的技巧,所以本文主要討論用C語言去實現二叉樹遍歷的幾種不同算法。

[關鍵詞]: 數據結構; 樹; 二叉樹; 二叉樹的遍歷; C語言

《數據結構》在計算機科學中是一門綜合性的專業基礎課。《數據結構》的研究不僅涉及到計算機硬件(特別是編碼理論、存儲裝置和存取方法等)的研究范圍,而且和計算機軟件的研究有著更密切的關系,無論是編譯程序,還是操作系統,都涉及到數據元素在存儲器中的分配問題。在研究信息檢索時也必須考慮如何組織數據,以便查找和存取數據元素更為方便。可以認為《數據結構》是介于數學、計算機硬件和計算機軟件三者之間的一門核心課程,是從事計算機科學及其應用的科技工作者必須掌握的重要課程。

在《數據結構》中,樹型結構是結點之間有分支的、層次的關系的結構。樹結構在客觀世界中廣泛存在,如人類的族譜、動植物的分類、圖書情報資料的編目等,都可以按照層次表示成樹的形式。在計算機程序設計方面,樹也是很重要的,如在編譯程序中,可以用樹來表示源程序的語法結構。又如在數據庫系統中,樹形結構也是信息的重要組織形式之一。

樹型結構是一類重要的非線性數據結構。其中以樹和二叉樹最為常用。

1、 樹 (Tree)

樹是n(n>=0)

個結點的有限集。在一棵非空樹中:(1)有且僅有一個特定的稱為根(Root)的結點;(2)當n>1時,其余結點可分為m(m>0)個互不相交的有限集T1,T2,……,Tm,其中每一個集合本身又是一棵樹,并且稱為子樹(Subtree)。結點擁有的子樹數稱為結點的度(degree)。樹的度是樹內各結點的度的最大值。

2、 二叉樹 (Binary tree)

二叉樹是另一種樹型結構,它的特點是每個結點至多只有二棵子樹(即二叉樹中不存在度大于2的結點),二叉樹的子樹有左右之分,其次不能任意顛倒。二叉樹第i層上的結點數目最多為2i-1(i>=1);深度為k的二叉樹至多有2k-1個結點,(k≥1);對任何一棵二叉樹T,如果其終端結點數n0,度為2的結點數為n2

,則n0=n2+1。

對于使用C語言去實現二叉樹,首先需要抽象其二叉樹的數據類型。也就是需要構造一個基本二叉樹的基礎操作的類和一個二叉樹結點數據類型。

第一步分析結點數據類型;

二叉樹的結點包括有本身的數據和左右子女的位置。

第二步是去設計二叉樹的基本操作,這里需要通過分析該二叉樹基本功能,然后去構造一個類來完成,這部需要使用到上一步中的自定義類型。

二叉樹的基本功能包括:

InitBiTree(&T);

操作結果:構造空二叉樹T.

DestroyBiTree(&T);

初始條件:二叉樹T已經存在.

操作結果:銷毀二叉樹T.

CreateBiTree(&T,description);

初始條件:給出二叉樹的定義.

操作結果:根據description構造二叉樹T.

ClearBiTree(&T);

初始條件:二叉樹T已經存在.

操作結果:清空二叉樹.

IsEmptyBiTree(T);

初始條件:二叉樹T已經存在.

操作結果:若T為空二叉樹,則返回TRUE;否則返回FALSE.

GetBiTreeDepth(T);

初始條件:二叉樹T存在.

操作結果:返回T的深度.

GetBiTreeRoot(T,&&root);

初始條件:二叉樹T存在且不為空.

操作結果:返回二叉樹T的root根結點.

GetBiTNodeValue(e,&value);

初始條件:結點e存在.

操作結果:返回結點e的data值字段.

AssignBitNode(&e,value);

初始條件:結點e存在.

操作結果:把value的值賦給結點e的data字段.

GetBiTNodeParent(T,e,&parent);

初始條件:二叉樹T,結點e存在.

操作結果:若e是T的非根結點,則返回它的雙親,否則返回NULL.

GetBiTNodeLeftChild(e,&lChild);

初始條件:e存在,e是T的某個結點.

操作結果:若e有左孩子,則返回它的左孩子,否則返回NULL.

GetBiTNodeRightChild(e,&rChild);

初始條件:e存在,e是T的某個結點.

操作結果:若e有右孩子,則返回它的右孩子,否則返回NULL.

GetBiTNodeLeftSibling(T,e,&lSibling);

初始條件:二叉樹T存在,結點e存在,e是T的結點.

操作結果:返回e的左兄弟,若e無左兄弟,返回NULL.

GetBiTNodeRightSibling(T,e,&rSibling);

初始條件:二叉樹T存在,結點e存在,e是T的結點.

操作結果:返回e的右兄弟,若e無右兄弟,返回NULL.

InsertBiTNode(T,p,LR,c);

初始條件:二叉樹T,p是指向要插入的結點,LR是左右枚舉,c是要插入的結點.

操作結果:根據枚舉LR的內容,插入結點e到p所指向的結點下.

DeleteBiTNode(T,p,LR);

初始條件:二叉樹T存在,p是指向要刪除的結點,LR是左右枚舉.

操作結果:根據枚舉LR的內容,刪除結點e的左/右結點.

PreOrderBiTreeTraverse(&T,visit());

初始條件:二叉樹T存在,visit是對結點操作的函數.

操作結果:先序遍歷T,對每個結點調用visit函數.

InOrderBiTreeTraverse(&T,visit());

初始條件:二叉樹T存在,visit是對結點操作的函數.

操作結果:中序遍歷T,對每個結點調用visit函數.

PostOrderBiTreeTraverse(&T,visit());

初始條件:二叉樹T存在,visit是對結點操作的函數.

操作結果:后序遍歷T,對每個結點調用visit函數.

LevelOrderBiTreeTraverse(&T,visit());

初始條件:二叉樹T存在,visit是對結點操作的函數.

操作結果:層序遍歷T,對每個結點調用visit函數.

DisplayBiTree(BiTree T);

初始條件:二叉樹存在.

操作結果:顯示二叉樹的內容.

3、 二叉樹的遍歷(Traversing binary tree)

在二叉樹的一些應用中,常常要求在樹中查找具有某些特征的結點,或者對樹中全部結點逐一進行某種處理。遍歷二叉樹是二叉樹的一種重要的運算。

所謂遍歷(Traversal)是指按某條搜索路徑巡訪樹中每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。“訪問”的含義很廣,可以是對結點作可種處理,如輸出結點的信息等。

設訪問根結點記作 V

遍歷根的左子樹記作 L

遍歷根的右子樹記作 R

則可能的遍歷次序有

前序?VLR

中序?LVR

后序?LRV

3.1中序遍歷(Inorder Traversal)

二叉樹算法的定義:

若二叉樹為空,則空操作;

否則

中序遍歷左子樹 (L);

訪問根結點 (V);

中序遍歷右子樹 (R)。

中序遍歷二叉樹的遞歸算法

void InOrder ( BinTreeNode *T ) {

if ( T !=

NULL ) {

InOrder ( T->leftChild );

Visit( T->data);

InOrder ( T->rightChild );

}

}

3.2前序遍歷(Preorder Traversal)二叉樹算法的定義:

若二叉樹為空,則空操作;

否則

訪問根結點 (V);

前序遍歷左子樹 (L);

前序遍歷右子樹 (R)。

前序遍歷二叉樹的遞歸算法

void PreOrder ( BinTreeNode *T ) {

if ( T !=

NULL ) {

Visit( T->data);

PreOrder

( T->leftChild );

PreOrder ( T->rightChild );

}

}

3.3后序遍歷(Postorder Traversal)二叉樹算法的定義:

若二叉樹為空,則空操作;

否則

后序遍歷左子樹 (L);

后序遍歷右子樹 (R);

訪問根結點 (V)。

后序遍歷二叉樹的遞歸算法:

void PostOrder ( BinTreeNode * T ) {

if ( T !=

NULL ) {

PostOrder ( T->leftChild );

PostOrder ( T->rightChild );

Visit( T->data);

}

}

4、 二叉樹遍歷算法的應用舉例

我們可以在三種遍歷算法的基礎上改造完成的其它二叉樹算法,如:?求葉子個數,求二叉樹結點總數,求度為1或度為2的結點總數,復制二叉樹,建立二叉樹,交換左右子樹,查找值為n的某個指定結點,刪除值為n的某個指定結點,等等。

4.1按前序建立二叉樹(遞歸算法)

Status CreateBiTree ( BiTree& T ) {

scanf(&ch);

if (

ch==‘’ ) T=NULL; //讀入根結點的值

else{

if ( !(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);

//建立根結點

T->data = ch;

CreateBiTree ( T->leftChild );

CreateBiTree ( T->rightChild );

}

return OK;

}//CreateBiTree

4.2?計算二叉樹結點個數(遞歸算法)

int Count ( BinTreeNode *T ) {

if ( T ==

NULL ) return 0;

else

return 1 + Count ( T->leftChild )

+ Count ( T->rightChild );

}

4.3求二叉樹中葉子結點的個數

int Leaf_Count(Bitree T)

{//求二叉樹中葉子結點的數目

if(!T) return 0; //空樹沒有葉子

elseif(!T->lchild&&!T->rchild)

return 1; //葉子結點

else return

Leaf_Count(T-lchild)+Leaf_Count(T-rchild); //左子樹的葉子數加上右子樹的葉子數

}

4.4?求二叉樹高度(遞歸算法)

int Height ( BinTreeNode * T )

{

if ( T ==

NULL ) return 0;

else?{

int m = Height ( T->leftChild );

int n = Height ( T->rightChild ) );

return (m > n) ? m+1 :

n+1;

}

}

4.5?復制二叉樹(遞歸算法)

BiTNode* Copy( BinTreeNode * T )

{

if ( T == NULL ) return NULL;

if(!(Temp=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);

Temp->data=T->data;

Temp-> leftChild = Copy( T->leftChild

);

Temp-> rightChild =

Copy(T->rightChild );

return Temp;

}

4.6?判斷二叉樹等價(遞歸算法)

int Equal( BinTreeNode *a, BinTreeNode *b) {

if ( a == NULL && b == NULL )

return 1;

if ( a !== NULL && b !== NULL

&&

a->data==b->data

&& equal(

a->leftChild, b->leftChild)

&& equal(

a->rightChild, b->rightChild) )

return 1;

return

0;//如果a和b的子樹不等同,則函數返回0

}

二叉樹的遍歷也為后面的數據結構:線索二叉樹以及線索化后的查找算法,

最優二叉樹(哈夫曼樹)的概念、構成和應用,樹與森林的遍歷算法及其與二叉樹遍歷算法的聯系,?樹與森林和二叉樹的轉換做好鋪墊。

參考文獻:

1 嚴蔚敏,吳偉民編著《數據結構》。清華大學出版社

2 唐策善,黃劉生編著《數據結構》。中國科學技術大學出版社

谷立東 1967年出生于牡丹江 大學本科

講師一直從事計算機教學電話:3946366356,gld99@sina.com

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

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

相關文章

c語言編程出彩色告白,C語言告白代碼,一閃一閃亮晶晶~

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓#include #include #include #define I 20#define R 340int main(){int i,j,e;int a;for(i1,aI;ifor(j(int) ( I-sqrt(I*I-(a-i)*(a-i)) );j>0;j--)printf(" ");for(e1;e<2*sqrt(I*I-(a-i)*(a-i));e)printf("…

計算機二級c語言2021年重點內容,2021年5月計算機二級C語言試題(總)

一個考生的快樂&#xff0c;不是因為他備考的時間多&#xff0c;而是因為他的選擇對。選擇考無憂題庫&#xff0c;做二級C語言試題&#xff0c;助你備考輕松&#xff01;二級C語言試題【1】1.若有以下數組說明&#xff0c;則i10;a[a[i]]元素數值是(C)。int a[12]{1,4,7,10,2,5,…

c語言case key pres,C#程序設計B-中國大學mooc-題庫零氪

第2講 C#語言基礎2.1 數據類型、變量與常量 —— 語言中的單詞隨堂測驗1、(加號)可以表示A、算術的加法B、正號C、字符串的連接D、事件的注冊()2、int是引用類型3、string是引用類型4、double在內存中占8個字節5、int占2個字節6、Person p1 new Person(18); //Person是引用類型…

c語言遞歸求差分方程,如何使這個簡單的遞推關系(差分方程)尾遞歸?

bytebuster的解決方案很好&#xff0c;但他沒有解釋他是如何創建它的&#xff0c;所以它只會幫助解決這個特定的問題。順便說一句&#xff0c;你的公式看起來有點像斐波納契(但不完全)&#xff0c;它可以是calculated analytically without any looping(即使沒有循環隱藏在Seq.…

android text 字體設置,Android TextView個別字體格式設置小結

android 在同一個TextView中如何展現出不同的字體和顏色總結一下1.主要是痛通過String.xml使用html標簽靜態配置然后動態引用Html.fromHtml(getResources().getString(R.string.myHeadStr));2.textView 動態設置//創建一個 SpannableString對象 msp new SpannableString("…

android 圖片合成pdf文件,教你怎么把多張圖片合成一個pdf文件

當你遇到需要把多張圖片合并成一個pdf文件時&#xff0c;你需要怎么做?可能有些朋友會說下載一個pdf格式轉換工具&#xff0c;其實不必這么麻煩&#xff0c;你只要把文件上傳到在線迅捷pdf轉換器&#xff0c;就可以一站式幫你搞定pdf文件的格式轉換以及一些常用的功能操作(如p…

android中的xml布局文件如何引用另一個xml布局文件,引用另一個layout.xml文件而不復制它...

如果我理解正確提問者對XLARGE和SW-600dp的一個布局文件&#xff0c;另一個用于所有的休息。無論如何&#xff0c;當我偶然發現這個問題時&#xff0c;就是這樣。可以通過創建文件夾layout-xlarge和layout-s600dp來解決這個問題&#xff0c;并在每個文件夾中放置一個布局文件&a…

華為系統鴻蒙優勢,華為鴻蒙2.0可以替代安卓嗎,華為鴻蒙2.0優勢在哪

在華為開發者大會上&#xff0c;華為消費業務CEO 余承東&#xff0c;正式發布鴻蒙OS2.0&#xff0c;并宣布華為鴻蒙OS將全面啟用全場景生態&#xff0c;并將于2020年12月發布手機版。余承東還表示&#xff0c;明年&#xff0c;華為的智能手機將全面升級&#xff0c;以支持鴻蒙操…

網頁自動關機代碼HTML,win10系統打開郵件顯示網頁html源代碼如何解決

有不少win10系統用戶在打開郵件的時候&#xff0c;發現內容全是顯示網頁的html源代碼&#xff0c;無法看到內容&#xff0c;遇到這樣的問題該怎么辦呢&#xff0c;通常是自帶的"郵件和日歷"應用暫時不支持查看HTML格式的郵件&#xff0c;下面給大家分享一下具體的解決…

android 界面長按,Android 主界面長按創建快捷方式

Android中創建快捷方式主要有兩種方式。一是在代碼中直接加入生成桌面快捷方式的代碼&#xff1b;二是通過小部件加入;這篇文章主要講另外一種方法&#xff01;1、通過在AndroidManifest文件里為Activity加入加入之后。長按桌面&#xff0c;小部件中會有你應用的圖標出現&#…

android+fastboot+命令,Android手機fastboot刷機命令

先進入fastboot文件所在目錄連接硬件命令fastboot devices刪除recover、boot,system同理Fastboot erase recovery重刷&#xff0c;boot,system同理Fastboot flash recovery cn170.img只需將boot.img和system.img刷入系統即可完成系統的刷新惡補:FASTBOOT命令有加載驅動 | fastb…

retrofit 2.0 android 教程,初識Retrofit2.0

Retrofit無疑是當下最流行的Android網絡請求框架了&#xff0c;是Square提供的開源產品。官方網站是這樣介紹Retrofit的—-A type-safe HTTP client for Android and Java&#xff0c;為Android平臺的應用提供一個類型安全的HTTP客戶端。Retrofit 是一套注解形式的網絡請求封裝…

怎么創建計算機快捷方式到桌面兩種方法,使用腳本主機創建Windows快捷方式 - Windows Client | Microsoft Docs...

如何使用腳本宿主創建Windows快捷方式12/03/2020本文內容本文介紹如何通過使用 Microsoft Windows Script Host (WSH) Visual FoxPro 創建桌面快捷方式。適用于&#xff1a; Windows 10 - 所有版本&#xff0c;Windows Server 2012 R2原始 KB 編號&#xff1a; 244677摘要WS…

swagger-ui.html 404,解決訪問swagger2報404問題

近來為了項目的接口文檔&#xff0c;而集成了swagger2&#xff0c;但是集成完畢后&#xff0c;訪問swagger-ui.html卻報404&#xff0c;檢查后發現&#xff0c;原來是被攔截了。下面寫一下我的解決方法。首先新建 WebConfig類實現WebMvcConfigurer接口&#xff0c;WebMvcConfig…

正確使用計算機說課稿,《初識計算機》說課稿

說課稿我說課的題目是《初識計算機》首先說教材&#xff0c;我校信息技術課程沒有專用教材&#xff0c;依據柳河縣教師進修學校小學三年級信息技術考核標準&#xff0c;我根據大連理工出版社出版的小學信息技術教材內容進行修改之后&#xff0c;用于我校三年級信息技術課程。本…

小學生學計算機編程的必要,小學生學編程,真的那么重要嗎

原標題&#xff1a;小學生學編程&#xff0c;真的那么重要嗎編程簡單的說就是告訴計算機要做什么。人類需要將解決問題的思路、方法和手段通過計算機能夠理解的形式告訴計算機&#xff0c;使得計算機能夠根據人的指令一步一步去工作&#xff0c;完成某種特定的任務。計算機是迄…

家用計算機機箱怎么選,DIY裝機怎么選擇電腦機箱 新手必讀的電腦主機箱選購指南...

在這個講究顏值的時代&#xff0c;對于一些主要外觀的外觀黨來說&#xff0c;內外皆修的機箱也是算重要的。DIY裝機怎么選擇電腦機箱&#xff1f;下面裝機之家小編就來談下新手必讀的電腦主機箱選購指南&#xff0c;對于裝機選擇機箱困難癥的朋友不妨來看看。一、首先要明白自己…

計算機啟動應用程序的方法,excel的程序_Excel2010中啟動應用程序的三種方法

使用Excel時&#xff0c;需要先啟動應用程序&#xff0c;怎么去進行操作啟動它?今天&#xff0c;學習啦小編就教大家在Excel2010中啟動應用程序的三種方法。Excel2010中啟動應用程序的三種步驟如下&#xff1a;1.開始菜單在桌面上&#xff0c;單擊“開始”&#xff0c;“所有程…

西安工業學院計算機系王翊,西安文理學院藝術學院

“愛的長歌”聲樂教學與實踐匯報音樂會——王翊師生音樂會圓滿結束6月26日我院第八場“愛的長歌”聲樂教學與實踐匯報音樂會—王翊師生音樂會圓滿結束。音樂會受到老師和同學的一致贊譽。整場音樂會高潮迭起&#xff0c;掌聲不斷。音樂會的學生由16級音樂表演專業的聲樂方向的同…

計算機控制系統的穩態誤差,計算機控制系統的穩態誤差.doc

計算機控制系統的穩態誤差計算機控制系統報告--計算機控制系統的穩態誤差在計算機控制系統中存在穩態誤差。怎樣計算穩態誤差呢&#xff1f;在連續系統中&#xff0c;穩態誤差的計算可以通過兩種方法計算&#xff1a;一是建立在拉氏變換中值定理基礎上的計算方法&#xff0c;可…