二叉樹近期公共父節點

2021-09-07 05:45:13 字數 1448 閱讀 7331

在二叉樹中找近期公共父節點。分為兩種情況,一種是有父指標,一種沒有父指標。

這樣的情況比較簡單。計算兩個結點的深度,再把深度大的向上移。移到同一深度。在同一時候向上移動,直到兩個結點同樣,這樣便找到了父節點。

這個演算法時間複雜度為o(n)。

**實現:

#includestruct node

};int getdpeth(node *n)//結點n到根節點深度

return count;

}node* findnearestcommonancestor(node* n1, node* n2)

while (depth1 < depth2)

//向上找

while (n1 != n2)

return n1;

}int main()

for (int i = 0; i < 5; ++i)

node* ancestor = findnearestcommonancestor(a[7], a[6]);

}

這樣的情況有點難。

首先從根節點開始向下找,假設根節點等於當中乙個子節點,那麼根節點便是近期公共父結點。

否則計算左子樹和右子樹中包括n1或n2的個數。假設左子樹包括n1、n2那麼近期公共父結點在左子樹,假設右子樹包括n1和n2,那麼在右子樹。假設左右子樹各包括乙個,那麼近期公共父結點就是當前結點。假設二叉樹是平衡的,那麼演算法複雜度為o(logn)。

最壞情況就是樹成了鍊錶。演算法時間負責度為o(n^2)。

思路清晰了,能夠編寫**:

#includestruct node

};//計算當前結點包括n1、n2個數

int countmatch(node *current, node* n1, node* n2)

node* findlca(node* root, node* n1, node* n2)

int main()

for (int i = 0; i < 5; ++i)

node* ancestor = findlca(a[0],a[7], a[10]);

}

另一種方法,從下向上找。假設找到n1或n2,就把它傳給它的父結點,假設向下到頭都沒有找到,那麼返回null。假設當前結點左右子樹都返回非null,那麼當前結點就是近期公共父結點。這樣僅僅須要遍歷一遍。演算法時間複雜度為o(n)。

#includestruct node

};node* findlca(node *root, node* n1, node* n2)

int main()

for (int i = 0; i < 5; ++i)

node* ancestor = findlca(a[0], a[7], a[10]);

}

原始碼在github備份:

二叉樹的公共父節點

void findparent node root,node pt1,node pt2 1 對於二叉搜尋樹,裡邊的元素都是排好序的,那麼從根節點向下搜尋,找到第乙個節點p滿足p data pt1 data 且 p data pt2 data 假定pt1 data pt2 data 即是滿足要求的公共...

二叉樹 最近公共父節點

給定二叉樹中的任意兩點,求解該兩點的最近公共父節點。程式大致分為遞迴和非遞迴兩種方式,下面我們先來認識非遞迴的方式。非遞迴程式總體的思路 用一種常見高效的資料結構來記錄下二叉樹中的結構關係,由於是找父節點,所以要用子節點來查詢父節點,我們這裡用到的是hashmap來進行樹形關係的儲存。接下來就是先列...

二叉樹的最近公共父節點

給定一棵二叉樹和兩個節點,找出這兩個節點最近的乙個公共父節點。給出的兩個節點一定在樹中存在 結點的值是隨機的,可能會重複,結點中只包含left和right兩個子結點,沒有指向父節點的parent。此題可參考leetcode 236。考慮兩個結點的存在情況 乙個節點為是另外乙個節點的子或孫子節點,此時...