編號滿二叉樹 尋找任意兩結點的最近共同祖先

2021-08-11 18:13:03 字數 896 閱讀 6218

這是第一篇「技術性」部落格,希望以後越寫越多越好咯,本科生的期許hhh

這道題運用的主要性質就是對於滿二叉樹任意結點編號i ,其parent(若有) 為 i/2

關鍵在於對演算法的優化

一開始只想把**寫出來,於是用了 < math.h >的pow函式,意圖先算出兩個結點的level,然後根據level 的差值將高位的結點「拉到」與地位的結點同一高度,然後再共同向上尋找祖先.

v1的最大缺點(相對於v2)就是pow函式的使用使得**複雜度變成了

o(1+2+…+level_a) + o(1+2+…+level_b) (畢竟pow執行了這麼多次)

而顯然可以通過記錄乙個數來使複雜度變為 o(1+2+…+level_bigger)

但仍然很慢,因為這種方法有這麼幾步

找到兩個數的level

將較高的level降低到同一level(通過不斷除以2)

不斷同時除以2以找到共同結點(這是兩個數會相同)

然而v1,v2的方法還是蠢哭了。

通過觀察:可以用輾轉相除的方法(哪乙個大就哪個除以2)來進行計算

while(a != b)
這樣迴圈結束兩個數都成為了共同祖先,而且時間複雜度大大降低

然而故事還沒結束

#include 

using

namespace

std;

int main()

printf("%d\n",a);

}}

當然遺留了一些問題,這裡做個小筆記

求二叉樹中任意兩結點的距離

與該題的一道相似題為 求二叉樹中結點的最長距離。兩題看似有聯絡,但是做法不同。分析 距離和深度之間存在必然聯絡。如果已知最長距離的兩結點的最低公共根節點r 那麼我們求r 的左右子樹深度相加即最長距離求出。如下圖所示 我們發現a和b是最長距離,他們的最低公共根節點為c,假如我們知道c的左右子樹高度均為...

二叉樹,完全二叉樹,滿二叉樹

二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...

二叉樹 滿二叉樹和完全二叉樹

二叉樹是一種很重要的非線性資料結構,它是樹結構的一種重要的型別 它不是樹結構的特殊情況 其特徵是每個節點最多有兩個子樹。二叉樹的特點 二叉樹每個結點最多有 2個子結點,樹則無此限制 二叉樹中 結點的子樹 分成左子樹和右子樹,即使某結點只有一棵子樹,也要指明該子樹是左子樹,還是右子樹,就是說 二叉樹是...