二叉樹的遞歸定義及存儲

定義


最多有兩棵子樹的有序樹,稱為二叉樹。二叉樹是一種特殊的

遞歸定義:二叉樹是n(n>=0)個有限結點構成的集合。N=0稱為空二叉樹;n>0的二叉樹由一個根結點和兩互不相交的,分別稱為左子樹和右子樹的二叉樹構成。

二叉樹中任何結點的第1個子樹稱為其左子樹,左子樹的根稱為該結點的左孩子;二叉樹中任何結點的第2個子樹稱為其右子樹,左子樹的根稱為該結點的右孩子。如下圖是一個二叉樹:

圖1.二叉樹

滿二叉樹和完全二叉樹

在一棵二叉樹中,如果所有分支結點都存在左子樹和右子樹,并且葉子結點都在同一層上,這樣的二叉樹稱作滿二叉樹。一棵深度為k且由2k-1個結點的二叉樹稱為滿二叉樹。

如果一棵具有n個結點的二叉樹的結構與滿二叉樹的前n個結點的結構相同,這樣的二叉樹稱作完全二叉樹

圖2. 滿二叉樹和完全二叉樹


基本性質


這里規定二叉樹的根結點的層次為1。

性質1:則二叉樹的第i 層最多有2i-1個結點(在此二叉樹的層次從1開始,i≥1)

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

性質3:對任何一棵二叉樹T, 如果其葉結點個數為n0, 度為2的非葉結點個數為n2, 則有

??????? ?????n0 = n2?+ 1

性質4:具有 n(n>0)個結點的完全二叉樹的深度為?log2n?+1;?x?表示不超過x的最大整數。

性質5:如果對一棵有n個結點的完全二叉樹的結點按層序編號(從第1層到第?l og2n? +1層,每層從左到右),則對任一結點i(1≤i≤n),有:

(1)如果i=1,則結點i無雙親,是二叉樹的根;如果i>1,則其雙親是結點?i/2?。

(2) 如果2i<=n, 則結點i的左孩子結點是2i;否則,結點i為葉子結點,無左孩子結點。

(3)如果2i+1<=n,則結點i的右孩子是結點2i+1; 否則,結點i為葉子結點,無右孩子結點。


抽象數據類型


數據元素:具有相同特性的數據元素的集合。

結構關系:樹中數據元素間的結構關系由二叉樹的定義確定。

基本操作:樹的主要操作有

(1)創建樹IntTree(&T)

(2)銷毀樹DestroyTree(&T)

(3)構造樹CreatTree(&T,deinition)

(4)置空樹ClearTree(&T)

(5)判空樹TreeEmpty(T)

(6)求樹的深度TreeDepth(T)

(7)獲得樹根Root(T)

(8)獲取結點Value(T,cur_e,&e),將樹中結點cur_e存入e單元中。

(9)數據賦值Assign(T,cur_e,value),將結點value,賦值于樹T的結點cur_e中。

(10)獲得雙親Parent(T,cur_e),返回樹T中結點cur_e的雙親結點。

(11)獲得最左孩子LeftChild(T,cur_e),返回樹T中結點cur_e的最左孩子。

(12)獲得右兄弟RightSibling(T,cur_e),返回樹T中結點cur_e的右兄弟。

(13)插入子樹InsertChild(&T,&p,i,c),將樹c插入到樹T中p指向結點的第i個子樹之前。

(14)刪除子樹DeleteChild(&T,&p,i),刪除樹T中p指向結點的第i個子樹。

(15)遍歷樹TraverseTree(T,visit())


二叉樹的存儲結構


?二叉樹是非線性結構,即每個數據結點至多只有一個前驅,但可以有多個后繼。它可采用順序存儲結構和鏈式存儲結構。

1.順序存儲結構

????二叉樹的順序存儲,就是用一組連續的存儲單元存放二叉樹中的結點。因此,必須把二叉樹的所有結點安排成為一個恰當的序列,結點在這個序列中的相互位置能反映出結點之間的邏輯關系,用編號的方法從樹根起,自上層至下層,每層自左至右地給所有結點編號,缺點是有可能對存儲空間造成極大的浪費,在最壞的情況下,一個深度為k且只有k個結點的右單支樹需要2k-1個結點存儲空間。依據二叉樹的性質,完全二叉樹和滿二叉樹采用順序存儲比較合適,樹中結點的序號可以唯一地反映出結點之間的邏輯關系,這樣既能夠最大可能地節省存儲空間,又可以利用數組元素的下標值確定結點在二叉樹中的位置,以及結點之間的關系。圖5-5(a)是一棵完全二叉樹,圖5-5(b)給出的圖5-5(a)所示的完全二叉樹的順序存儲結構。

?(a)??一棵完全二叉樹??????????????????(b)????順序存儲結構

圖5-5?完全二叉樹的順序存儲示意圖

????對于一般的二叉樹,如果仍按從上至下和從左到右的順序將樹中的結點順序存儲在一維數組中,則數組元素下標之間的關系不能夠反映二叉樹中結點之間的邏輯關系,只有增添一些并不存在的空結點,使之成為一棵完全二叉樹的形式,然后再用一維數組順序存儲。如圖5-6給出了一棵一般二叉樹改造后的完全二叉樹形態和其順序存儲狀態示意圖。顯然,這種存儲對于需增加許多空結點才能將一棵二叉樹改造成為一棵完全二叉樹的存儲時,會造成空間的大量浪費,不宜用順序存儲結構。最壞的情況是右單支樹,如圖5-7?所示,一棵深度為k的右單支樹,只有k個結點,卻需分配2^k-1個存儲單元。

(a)?一棵二叉樹??????????????????????????(b)?改造后的完全二叉樹

(c)?改造后完全二叉樹順序存儲狀態

圖5-6?一般二叉樹及其順序存儲示意圖

?(a)?一棵右單支二叉樹??????(b)?改造后的右單支樹對應的完全二叉樹

? ? (c)?單支樹改造后完全二叉樹的順序存儲狀態

???????????????????圖5-7?右單支二叉樹及其順序存儲示意圖

????結構5-1二叉樹的順序存儲

復制代碼
#define Maxsize 100     //假設一維數組最多存放100個元素
typedef char Datatype;  //假設二叉樹元素的數據類型為字符
typedef struct
{ Datatype bt[Maxsize];int btnum;}Btseq;
復制代碼

2.鏈式存儲結構

????二叉樹的鏈式存儲結構是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關系。

通常的方法是鏈表中每個結點由三個域組成,數據域和左右指針域,左右指針分別用來給出該結點左孩子和右孩子所在的鏈結點的存儲地址。其結點結構為:

? 其中,data域存放某結點的數據信息;lchild與rchild分別存放指向左孩子和右孩子的指針,當左孩子或右孩子不存在時,相應指針域值為空(用符號∧或NULL表示)。利用這樣的結點結構表示的二叉樹的鏈式存儲結構被稱為二叉鏈表,如圖5-8所示。 ?

(a)?一棵二叉樹???????????????????????????(b)?二叉鏈表存儲結構

??????????????????圖5-8???二叉樹的二叉鏈表表示示意圖

????為了方便訪問某結點的雙親,還可以給鏈表結點增加一個雙親字段parent,用來指向其雙親結點。每個結點由四個域組成,其結點結構為:

?這種存儲結構既便于查找孩子結點,又便于查找雙親結點;但是,相對于二叉鏈表存儲結構而言,它增加了空間開銷。利用這樣的結點結構表示的二叉樹的鏈式存儲結構被稱為三叉鏈表。

????圖5-9給出了圖5-8?(a)所示的一棵二叉樹的三叉鏈表表示。

?圖5-9二叉樹的三叉鏈表表示示意圖

????盡管在二叉鏈表中無法由結點直接找到其雙親,但由于二叉鏈表結構靈活,操作方便,對于一般情況的二叉樹,甚至比順序存儲結構還節省空間。因此,二叉鏈表是最常用的二叉樹存儲方式。

結構5-2二叉樹的鏈式存儲

#define datatype char  //定義二叉樹元素的數據類型為字符
typedef struct  node   //定義結點由數據域,左右指針組成
{ Datatype data;struct node *lchild,*rchild;}Bitree;


轉載于:https://www.cnblogs.com/tham/p/6827431.html

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

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

相關文章

C++統計微妙級時間消耗(chrono)

有時我們需要統計某段程序運行所消耗的時間&#xff0c;通過C的chrono庫&#xff0c;我們可以輕松實現這一需求&#xff0c;例如&#xff0c;我們求斐波那契數列消耗的時間。 #include <iostream> #include <chrono> #include <iomanip> using namespace st…

content-length與Transfer-Encoding: chunked的問題釋疑

content-length與Transfer-Encoding: chunked的問題釋疑 http返回頭中content-length與Transfer-Encoding: chunked的問題釋疑 先說說問題出現的背景&#xff1a; 公司服務器與手機客戶端交互&#xff0c;客戶端請求一個動態生成的XML文件&#xff0c;在用firebug查看http響應頭…

基于RSA的加密/解密示例C#代碼

在C#程序中&#xff0c;大家可能比較熟悉的方式是md5加密解密方式&#xff0c;對RSA可能并不是很熟悉&#xff0c; 下面就說一下RSA加密和解密的算法&#xff1a;using System;using System.Security.Cryptography;using System.Text;class RSACSPSample{static void Main(){tr…

iOS GorupBy

轉自&#xff1a; IOS 數組分組 Grouped NSArray 12345678NSMutableSet *set[NSMutableSet set];[_list enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {[set addObject:obj["MeasureType"]];//利用set不重復的特性,得到有多少組,根據數組中的…

android通過adb shell播放音樂

am start -n com.android.music/com.android.music.MediaPlaybackActivity -d /sdcard/timian.mp3拓展閱讀 input keyevent 24 #增加音量 input keyevent 25 #降低音量 input keyevent 85 #暫停/播放 input keyevent 126 #恢復播放 input keyevent 127 #停止播放關閉音樂播放器…

NetBpm 安裝篇(1)

尊重別人勞動成果 轉載注明出處&#xff1a;http://www.cnblogs.com/anbylau2130/p/3875718.html 官方主頁 http://www.netbpm.org/docs/install.html 文件目錄 Netbpm的兩種服務器配置 1&#xff0c;CassiniWebServer CassiniWebServer.exe是輕量級的web服務器&#xff0c;相…

python將文本中的數據處理成圖像(matplotlib)

使用Python的matplotlib模塊可以很方便的將數據處理成圖表&#xff0c;使數據更加形象、直觀。 #!/usr/bin/env pythonimport matplotlib.pyplot as plt import numpy as np from mpl_toolkits.axes_grid.anchored_artists import AnchoredTexty1np.loadtxt(ReadDataCostTime.…

string 中的 length函數 和size函數 返回值問題

string 中的 length函數 和 size函數 的返回值 ( 還有 char [ ] 中 測量字符串的 strlen 函數 ) 應該是 unsigned int 類型的 不可以 和 -1 比較。 應盡量避免 unsigned int 類型 和 int類型 數據 的比較 。當unsigned int 類型 和 int類型 數據 比較 時 &#xff0c;會 把…

交叉編譯android版htop

編這個東西賊煩人。 話不多說&#xff0c;直接上教程 源代碼版本&#xff1a;htop-2.2.0、ncurses-6.1 編譯之前要確認自己有ndk&#xff0c;從【官網】直接下載&#xff0c;下載下來解壓一下就能用。 先編ncurses 編譯過程 ./configure CCarm-linux-androideabi-gcc-4.9 \-…

今天的一點點收獲

今天怎么說呢&#xff0c;還是有點收獲的&#xff0c;上午寫了一上午的前端&#xff0c;然后就是下午又是一下午的c#&#xff0c;好特么酸爽啊&#xff0c;但是有一件特別蛋疼的事情發生了&#xff0c;我 天天叫的學長竟然不是學長而是學校的而老師&#xff0c;但是他們都不叫他…

jquery動態添加刪除div--事件綁定,對象克隆

我想做一個可以動態添加刪除div的功能。中間遇到一個問題&#xff0c;最后在manong123.com開發文摘 版主的熱心幫助下解答了(答案在最后) 使用到的jquery方法和思想就是&#xff1a;事件的綁定和銷毀(unbind)&#xff0c;另外還可以使用clone,通過克隆可以很好的解決這個問…

編程知識大雜燴

以下資料完全是隨手記錄&#xff0c;沒有任何順序或關聯&#xff0c;需要用直接^F找就行了。 1. ps aux指令詳解 http://blog.csdn.net/hanner_cheung/article/details/6081440 2. Linux下配置Apache php http://lelong.iteye.com/blog/904125 3. shell定義變量 http://see.xid…

最長公共前綴

2、最長公共前綴 編寫一個函數來查找字符串數組中的最長公共前綴。 如果不存在公共前綴&#xff0c;返回空字符串 “”。 示例1 輸入: ["flower","flow","flight"] 輸出: "fl"示例2 輸入: ["dog","racecar",…

devexpress中gridcontrol頭部添加垂直線(右邊框)

winform開發&#xff0c;用devexpress中的gridcontrol控件&#xff0c;頭部默認是3D樣式&#xff0c;當客戶希望像內容一樣扁平化顯示且需要添加垂直線(右邊框)時惡夢開始了。。經過一陣摸索發現可以這樣解決&#xff1a; 1.設置GridControl的GridView控件的PaintStyleName屬性…

UITableView知識梳理須知—(一)

1、UITableView掌握 1> 設置UITableView的dataSource、delegate 2> UITableView多組數據和單組數據的展示 3> UITableViewCell的常見屬性 4> UITableView的性能優化&#xff08;cell的循環利用&#xff09; 5> 自定義Cell 2、什么是UITableView 在i…

Yarn中的幾種狀態機

1 概述 為了增大并發性&#xff0c;Yarn采用事件驅動的并發模型&#xff0c;將各種處理邏輯抽象成事件和調度器&#xff0c;將事件的處理過程用狀態機表示。什么是狀態機&#xff1f; 如果一個對象&#xff0c;其構成為若干個狀態&#xff0c;以及觸發這些狀態發生相互轉移的事…

反轉字符串里的單詞

4、反轉字符串里的單詞 給定一個字符串&#xff0c;逐個反轉字符串中的單詞 示例1&#xff1a; 輸入: "the sky is blue", 輸出: "blue is sky the".說明&#xff1a; 無空格字符構成一個單詞。 輸入字符串可以在前面或者后面包含多余的空格&#xff0…

正整數

題目鏈接&#xff1a;http://acm.hust.edu.cn/vjudge/contest/view.action?cid84077#problem/A 題目&#xff1a; Description A magic island Geraldion, where Gerald lives, has its own currency system. It uses banknotes of several values. But the problem is, the s…

360 webscan中防注入跨站攻擊的核心

//get攔截規則 $getfilter "\\<.javascript:window\\[.{1}\\\\x|<.*(&#\\d?;?)?>|<.*(data|src)data:text\\/html.*>|\\b(alert\\(|confirm\\(|expression\\(|prompt\\(|benchmark\s*?\\(\d?|sleep\s*?\\([\d\.]?\\)|load_file\s*?\\()|<[…

POJ 2115 C Looooops(擴展歐幾里得)

輾轉相除法&#xff08;歐幾里得算法&#xff09; 時間復雜度&#xff1a;在O(logmax(a, b))以內 int gcd(int a, int b) {if (b 0) return a;return gcd(b, a % b); }擴展歐幾里得算法 時間復雜度和歐幾里得算法相同 int extgcd(int a, int b, int& x, int& y) {int …