二叉樹 找出2個節點的最近公共祖先

2022-09-13 08:54:09 字數 1085 閱讀 7552

給定二叉樹(不是二叉搜尋樹)和兩個節點n1n2,編寫程式以找到他們的最近公共祖先(lowest common ancestor,lca)。

最近公共祖先是兩個節點所有公共祖先中離根節點最遠的節點。

計算節點的最近公共祖先是很有用的。

例如,為了確定樹中節點之間距離:從n1節點到n2節點的距離,可以計算從根到n1的距離加上從根到n2的距離,減去從根到它們最近共同祖先的距離的兩倍。

我們可以從根開始遍歷樹。 如果任一給節點(n1和n2)與根匹配,則根為lca。

如果根與任何節點都不匹配,我們重複左右子樹中尋找節點n1和n2。

如果在其左子樹中存在乙個節點而在右子樹中存在的另乙個節點,則此節點即為lca。

如果兩個節點都位於左子樹中,則lca也位於左子樹中,

否則lca位於右子樹中。

#include using

namespace

std;

//二叉樹節點

struct

node

;

//根據給定的值,建立乙個二叉樹節點,其左右子樹均為空

node* newnode(int

key) //

返回指向給定節點 n1 和 n1 lca 的指標

// 此方法假定節點 n1 和 n2 在數中均出現

struct node *findlca(struct node* root, int n1, int

n2)

intmain()

二叉樹中找出2個節點的最近公共祖先

給定二叉樹和兩個節點n1和n2,編寫程式以找到他們的最近公共祖先。在做這個之前,有些東西需要提前問清楚,二叉樹是不是二叉搜尋樹,如果是二叉搜尋樹,那就好處理多了.在保證2個節點都屬於此二叉樹的情況下,由於二叉搜尋樹是排序過的,位於左子樹的結點都比父結點小,而位於右子樹的結點都比父結點大,node.d...

二叉樹 最近公共父節點

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

二叉樹的最近公共父節點

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