【数据结构与算法】二叉堆与二叉搜索树的区别
問題描述
記得剛學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的時候,就容易混淆二叉堆和二叉搜索樹,其實雖說堆也是一種完全二叉樹,但二者差別還是挺大的,本文試做分析。
邏輯結(jié)構(gòu)
二叉堆和二叉搜索樹都是結(jié)點帶權(quán)重,并在父子結(jié)點間滿足某種規(guī)則的數(shù)據(jù)結(jié)構(gòu)。
二叉堆是一種完全二叉樹,分大根堆、小根堆兩種,子結(jié)點總是大于或小于父結(jié)點。
大根堆,顧名思義,根是最大的,每個子結(jié)點都要小于父結(jié)點,不區(qū)分左右兒子誰大誰小,也不必保證某個“孫子結(jié)點”一定要小于另一個“兒子結(jié)點”。
小根堆恰恰相反,根是最小的,每個子結(jié)點都要大于父結(jié)點,不區(qū)分左右兒子誰大誰小,也不必保證某個“孫子結(jié)點”一定要大于另一個“兒子結(jié)點”。
二叉搜索樹是一種特殊的二叉樹,左兒子結(jié)點小于父結(jié)點,右兒子結(jié)點大于父結(jié)點。
所謂的AVL樹、紅黑樹等復(fù)雜一些的樹狀數(shù)據(jù)結(jié)構(gòu),很多都是二叉搜索樹優(yōu)化得到的。
存儲結(jié)構(gòu)
二叉堆和二叉搜索樹看似都是“樹”,實則在存儲結(jié)構(gòu)上差別很大。
我們也知道,順序存儲和鏈接存儲是兩種基本的存儲結(jié)構(gòu)。順序存儲減少了指針等的額外空間浪費,沒有結(jié)點這個問題,卻在某個元素的增刪后的調(diào)整上很麻煩,且必須在內(nèi)存中連續(xù)分配;鏈接存儲反是。
由于二叉堆是一種完全二叉樹,所以可以按照 id 編號,通過數(shù)組存取,更好的是用順序表(Java黨參考java.util.ArrayList,C++黨參考STL-vecter),根據(jù) id 訪問父結(jié)點或子結(jié)點,既節(jié)約了指針空間的結(jié)構(gòu)性開銷,也
總結(jié)
以上是生活随笔為你收集整理的【数据结构与算法】二叉堆与二叉搜索树的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSDN博客如何显示空白符
- 下一篇: 【数据结构与算法】带环单链表查找环的入口