二叉樹中兩個節點的最低公共祖先

2021-08-26 20:19:14 字數 1111 閱讀 3076

求二叉樹樹中的兩個節點的最低公共祖先是個有趣的問題,涉及到對遞迴的理解。

可以參考部落格:

**:下面是乙個簡單的複雜度為 o(n) 的演算法,解決lca問題

1)找到從根到n1的路徑,並儲存在乙個向量或陣列中。

2)找到從根到n2的路徑,並儲存在乙個向量或陣列中。

3)遍歷這兩條路徑,直到遇到乙個不同的節點,則前面的那個即為最低公共祖先.

需要log(n)的輔助空間。

// o(n) 解決 lca

#include

#include

using namespace std;

//二叉樹節點

struct node

;//公用函式,生成乙個節點

node * newnode(int k)

//找到從root到 節點值為key的路徑,儲存在path中。沒有的話返回-1

bool findpath(node * root,vector&path,int key)

int findlca(node * root,int key1,int key2)

上面的方法雖然是o(n),但是操作依然繁瑣了一點,並且需要額外的空間來儲存路徑。其實可以只遍歷一次,利用遞迴的巧妙之處。學好二叉樹,其實就是學好遞迴。

從root開始遍歷,如果n1和n2中的任乙個和root匹配,那麼root就是lca。 如果都不匹配,則分別遞迴左、右子樹,如果有乙個 key(n1或n2)出現在左子樹,並且另乙個key(n1或n2)出現在右子樹,則root就是lca.  如果兩個key都出現在左子樹,則說明lca在左子樹中,否則在右子樹。

/* 只用一次遍歷解決lca */

#include

using namespace std;

struct node

;node* newnode(int key)

// 返回n1和n2的 lca的指標

// 假設n1和n2都出現在樹中

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

//測試

int main()

求二叉樹中兩個節點的最低公共祖先

結點結構 template struct binarysearchtreenode binarysearchtreenode left binarysearchtreenode right binarysearchtreenode parent v val 尋找最低公共祖先 binarysearch...

二叉樹中兩節點的最低公共祖先

二叉樹中兩節點的最低公共祖先 要求如下 給定乙個頭節點head 和另外兩個節點 a b 返回 a 和 b 的最低公共祖先 和思路如下 package beginner.tree 給定乙個頭節點head 和另外兩個節點 a b 返回 a 和 b 的最低公共祖先 auther 蘇察哈爾丶燦 date 2...

樹中兩個節點的最低公共祖先

首先想一下 一.如果是搜尋二叉樹的話 可以採用遞迴的方式 思路 樹的根節點作為尋找的起點,把根節點作為當前節點 1.如果這兩個節點都大於當前節點,那麼這兩個節點的最低祖先肯定在當前節點節點的右子樹中,然後在當前節點的右子樹中找 2.如果兩個節點的都小於當前節點節點,那麼這兩個節點的最低祖先肯定在當前...