日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据结构五——二叉树

發(fā)布時(shí)間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构五——二叉树 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章出處:極客時(shí)間《數(shù)據(jù)結(jié)構(gòu)和算法之美》-作者:王爭(zhēng)。該系列文章是本人的學(xué)習(xí)筆記。

1 樹(shù)

1.1 概念

概念:樹(shù)、根、父節(jié)點(diǎn)、子節(jié)點(diǎn)、葉子節(jié)點(diǎn)。
幾個(gè)度:高度、深度、層。與實(shí)際生活中的這幾個(gè)概念類比。
高度:從下往上數(shù)(從葉子往根),從0開(kāi)始。
深度:從上往下看(從根往葉子),從0開(kāi)始。
層數(shù):深度+1

2 二叉樹(shù)

2.1 定義

定義:每個(gè)節(jié)點(diǎn)最多有兩個(gè)子節(jié)點(diǎn)。

 滿二叉樹(shù):除了葉子節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn),其余每個(gè)節(jié)點(diǎn)都有2個(gè)子節(jié)點(diǎn)。
 完全二叉樹(shù):1 葉子節(jié)點(diǎn)在最下面兩層;2 最后一層的葉子節(jié)點(diǎn)都靠左排列;3 除了最后一層,其他層的節(jié)點(diǎn)達(dá)到最大個(gè)數(shù)。
 二叉樹(shù)的存儲(chǔ):有兩種方式。一種是鏈?zhǔn)酱鎯?chǔ),一個(gè)節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù),兩個(gè)指針?lè)謩e指向左右子節(jié)點(diǎn)。一種是順序存儲(chǔ)(數(shù)組存儲(chǔ))。根節(jié)點(diǎn)在下標(biāo)為1的位置。左節(jié)點(diǎn)存儲(chǔ)下標(biāo)為2i=2,右節(jié)點(diǎn)存儲(chǔ)下標(biāo)為2i+1=3。依次類推。下標(biāo)為i的節(jié)點(diǎn),左子節(jié)點(diǎn)存儲(chǔ)在下標(biāo)為2i的位置,右子節(jié)點(diǎn)存儲(chǔ)在2i+1的位置。

class Node{T value;Node leftChild;Node rightChild; }

如果一棵樹(shù)是完全二叉樹(shù),使用數(shù)組存儲(chǔ)的話,只有下標(biāo)為0的位置是空的,其余完全利用。而且不需要額外的指針,更節(jié)約空間。這也是完全二叉樹(shù)單獨(dú)提出來(lái)的原因。

2.2 遍歷

二叉樹(shù)的遍歷有前序遍歷、中序遍歷、后續(xù)遍歷,和層次遍歷。前中后序遍歷是指訪問(wèn)節(jié)點(diǎn)與其子節(jié)點(diǎn)的相對(duì)順序。
前序遍歷:訪問(wèn)節(jié)點(diǎn),訪問(wèn)左子節(jié)點(diǎn),訪問(wèn)右子節(jié)點(diǎn)
中序遍歷:訪問(wèn)左子節(jié)點(diǎn),訪問(wèn)節(jié)點(diǎn),訪問(wèn)右子節(jié)點(diǎn)
后續(xù)遍歷:訪問(wèn)左子節(jié)點(diǎn),訪問(wèn)右子節(jié)點(diǎn),訪問(wèn)節(jié)點(diǎn)
 前中后序遍歷是一個(gè)遞歸過(guò)程。遞歸的重點(diǎn)是不是能寫出遞歸公式。寫遞歸公式的重點(diǎn)是能不能將要解決的問(wèn)題A,分解為子問(wèn)題B、C、D,假設(shè)B、C、D已經(jīng)解決,如何利用B、C、D的結(jié)果來(lái)解決問(wèn)題A。

前序遍歷遞推公式: preOrder(r)=print r->preOrder(r.leftChild)->preOrder(r.rightChild); 中序遍歷遞推公式 inOrder(r)=inOrder(r.leftChild)->print r->inOrder(r.rightChild); 后序遍歷遞推公式 postOrder(r)=postOrder(r.leftChild)->postOrder(r.rightChild)->print r;

2.3思考題

給定一組數(shù)據(jù)1,3,5,6,9,10。可以構(gòu)造出多少種不同的二叉樹(shù)。
答案:卡特蘭數(shù)。

3 二叉查找樹(shù)

定義:二叉查找樹(shù)中任意一個(gè)節(jié)點(diǎn)的左子樹(shù)中的每一個(gè)節(jié)點(diǎn)都要求小于當(dāng)前節(jié)點(diǎn),右子樹(shù)的任意一個(gè)節(jié)點(diǎn)都要求大于當(dāng)前節(jié)點(diǎn)。

3.1 二叉查找樹(shù)的查找

當(dāng)要查找一個(gè)數(shù)的時(shí)候,從根節(jié)點(diǎn)開(kāi)始。如果要查找的值等于根節(jié)點(diǎn)的值,則返回。如果要查找的值大于根節(jié)點(diǎn)的值,則在右子樹(shù)遞歸查找。否則,要從左子樹(shù)遞歸查找。

3.2 二叉查找樹(shù)的插入

插入操作與查找操作類似。從根節(jié)點(diǎn)開(kāi)始。如果要插入的數(shù)據(jù)比節(jié)點(diǎn)數(shù)據(jù)大,并且節(jié)點(diǎn)的右子樹(shù)是空的,則直接插入右子節(jié)點(diǎn);如果右子樹(shù)不為空,遞歸查找右子樹(shù),尋找插入位置。
如果要插入的數(shù)據(jù)比節(jié)點(diǎn)數(shù)據(jù)小,并且節(jié)點(diǎn)的左子樹(shù)是空的,則直接插入左子節(jié)點(diǎn);如果左子樹(shù)不為空,則遞歸查找左子樹(shù),尋找插入位置。

3.3 二叉查找樹(shù)的刪除

二叉樹(shù)的刪除操作比較復(fù)雜,需要分情況討論。
 規(guī)則1:要?jiǎng)h除的節(jié)點(diǎn)是一個(gè)葉子節(jié)點(diǎn),例如55。將其父節(jié)點(diǎn)指向該節(jié)點(diǎn)的引用置為空即可。
 規(guī)則2:要?jiǎng)h除的節(jié)點(diǎn)有一個(gè)子節(jié)點(diǎn),例如13。將13父節(jié)點(diǎn)指向該節(jié)點(diǎn)的引用指向13的葉子節(jié)點(diǎn)。
 規(guī)則3:要?jiǎng)h除的節(jié)點(diǎn)有兩個(gè)子節(jié)點(diǎn),例如18。在18的右子樹(shù)查找最小值19,將18節(jié)點(diǎn)的value值改為最小值19,刪除節(jié)點(diǎn)19,應(yīng)用規(guī)則1或者規(guī)則2刪除節(jié)點(diǎn)19。

二叉樹(shù)的刪除還有一種操作方法是將要?jiǎng)h除的數(shù)據(jù)標(biāo)記為刪除狀態(tài),并且真正刪除。這樣做會(huì)浪費(fèi)部分空間,但整體時(shí)間復(fù)雜度不會(huì)受影響,且實(shí)現(xiàn)簡(jiǎn)單。

3.4其他操作

查找最大值
查找最小值
中序遍歷得到一個(gè)順序數(shù)組,時(shí)間復(fù)雜度O(n),非常高效,所以二叉查找樹(shù)又被稱為二叉排序樹(shù)。

3.5 支持重復(fù)元素

如果要插入的元素有重復(fù)的,該怎么處理?
 一種處理方法參考散列表的鏈?zhǔn)酱鎯?chǔ)。樹(shù)的每個(gè)節(jié)點(diǎn)存儲(chǔ)數(shù)值的是一個(gè)鏈表,遇到值相同的元素就依次添加到鏈表中。
 一種處理方法是,大于等于當(dāng)前節(jié)點(diǎn)的元素都插入到右子樹(shù)。當(dāng)要查找的時(shí)候,遇到相等的元素不停下來(lái),而是繼續(xù)查找,直到找到所有要查找的值值相同的元素。刪除的時(shí)候也是同樣。要?jiǎng)h除每一個(gè)等于要?jiǎng)h除值的節(jié)點(diǎn)。

3.6二叉查找樹(shù)的時(shí)間復(fù)雜度分析


 二叉查找樹(shù)因?yàn)樾螒B(tài)多樣,查找時(shí)間復(fù)雜度也不相同。例如圖中第一棵樹(shù)已經(jīng)退化為鏈表,時(shí)間復(fù)雜度O(n)。
 第三棵樹(shù)是一棵完全二叉樹(shù)。無(wú)論查找、插入
 刪除,時(shí)間復(fù)雜度與它的高度成正比。一棵 包含n個(gè)節(jié)點(diǎn)的完全二叉樹(shù),高度是多少?
 完全二叉樹(shù)每一層節(jié)點(diǎn)數(shù)量是:1、2、4…2k?22^{k-2}2k?2,假設(shè)有k層。最后一層節(jié)點(diǎn)數(shù)量在1到2k?12^{k-1}2k?1之間。假設(shè)最后一層節(jié)點(diǎn)數(shù)量是2k?12^{k-1}2k?1。那么1+2+4+....+2k?1=n1+2+4+....+2^{k-1}=n1+2+4+....+2k?1=n,則k=log2(n+1)k=log_2(n+1)k=log2?(n+1)。假設(shè)最后一層節(jié)點(diǎn)數(shù)量是1,那么1+2+4+....+2k?2+1=n1+2+4+....+2^{k-2}+1=n1+2+4+....+2k?2+1=nk=log2n+1k=log_2n+1k=log2?n+1。k值的區(qū)間是[log2(n+1),log2n+1][log_2(n+1),log_2n+1][log2?(n+1),log2?n+1]。完全二叉樹(shù)的層數(shù)小于等于log2n+1log_2n+1log2?n+1,則完全二叉樹(shù)的高度小于等于log2nlog_2nlog2?n
 所以在理想情況下完全二叉樹(shù)的時(shí)間復(fù)雜度是O(logn)。

4 平衡二叉查找樹(shù)-紅黑樹(shù)

紅黑樹(shù)目前我只了解概念,關(guān)于從二三樹(shù)到紅黑樹(shù)之后再學(xué)習(xí)。

總結(jié)

以上是生活随笔為你收集整理的数据结构五——二叉树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。