1. 程式人生 > >面試題50 樹中兩個節點的最低公共祖先LCA(Lowest Common Ancestor )

面試題50 樹中兩個節點的最低公共祖先LCA(Lowest Common Ancestor )

題目是樹的最低公共祖先,我們先來考慮樹是什麼樹?

我們從最簡單的情況開始分析。

情況一:是二叉樹,且是二叉搜尋樹(二叉排序樹,二叉查詢樹)

分析:由於二叉排序樹具有這樣的特點:若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹

所以我們只需要從樹的根節點開始和輸入的兩個節點進行比較。如果當前節點的值比兩個節點都大,那麼最低公共父節點一定在當前節點的左子樹中,於是下一步遍歷當前節點的左子節點。如果當前節點比兩個節點都大,那麼最低公共父節點一定在當前節點的右子樹中,於是下一步遍歷當前節點的右子節點。這樣從樹中從上到下找到的第一個在輸入節點的值之間的節點就是最低公共祖先。

struct node //二叉樹節點資料結構
{
int data;
struct node* left;
struct node* right;
};

struct node* newNode(int );

Node* findLowerstCommonAncestor(Node* root,int value1,int value2)
{
while ( root!= NULL )
{
int value= root->getValue(); //獲取當前節點的值
if ( value> value1

&& value> value2 ) //當前節點的值大於兩輸入值
root
= root->getLeft();
elseif (value< value1&& value< value2) //當前節點的值校園兩輸入值
root
= root->getRight();
elsereturn root;
}
return NULL;
}

時間複雜度是樹的深度,空間複雜度是O(1)。

情況二:是二叉樹,但是普通的二叉樹

方法一一個簡單的複雜度為 O(n) 的演算法,解決LCA問題

1) 

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

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

3) 遍歷這兩條路徑,直到遇到一個不同的節點,則前面的那個即為最低公共祖先.(相當於尋找兩個連結串列上的最後一個公共節點)

// O(n) 解決 LCA
02 #include <iostream>
03 #include <vector>
04 using namespace std;
05
06 //二叉樹節點
07 struct Node
08 {
09 int key;
10 struct Node *left, *right;
11 };
12 //公用函式,生成一個節點

相關推薦

試題50 節點最低公共祖先LCA(Lowest Common Ancestor )

題目是樹的最低公共祖先,我們先來考慮樹是什麼樹? 我們從最簡單的情況開始分析。 情況一:是二叉樹,且是二叉搜尋樹(二叉排序樹,二叉查詢樹) 分析:由於二叉排序樹具有這樣的特點:若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右

試題節點最低公共祖先節點

1.樹為二叉搜尋樹,二叉搜尋樹特點:值:右>根>左 ①思路 從根節點開始遍歷 a:若該節點值比所給兩個節點均大,則公共祖先節點必在其左子樹上,遍歷其左子樹。 b:若該節點值比所給兩個節點均小,則公共祖先節點必在其右子樹上,遍歷其右子樹。 c:直到找到一個節點,位

結點的最低公共祖先(C++實現)

題目是,輸入兩個樹結點,求它們的最低公共祖先 首先,要說明的是,這是一組題目,根據劍指Offer上所講的,這道題可能會分好幾種情況,因此,如果在面試時候遇到,我們需要和麵試官溝通,而不是一上來就寫程式碼。 1. 如果給定樹是二叉搜尋樹 二叉

節點最低公共祖先節點(go)

該題目有以下幾種情況可以考慮 1. 樹是二叉搜尋樹,二叉搜尋樹的特點是根節點值大於所有左子樹節點值,小於所有右子樹節點值,則最低公共祖先即該節點值大於給定兩個節點中的一個值,小於另外一個節點的值,go程式碼實現如下 type TreeNode struct { Val int Lef

程式設計師面試100題之十六 二叉節點的最近公共節點

                這個問題可以分為三種情況來考慮:情況一:root未知,但是每個節點都有parent指標此時可以分別從兩個節點開始,沿著parent指標走向根節點,得到兩個連結串列,然後求兩個連結串列的第一個公共節點,這個方法很簡單,不需要詳細解釋的。情況二:節點只有左、右指標,沒有parent

《程式設計師面試金典》--尋找二叉節點的第一公共祖先(三種情況)

/**************************************************************************************************

【LeetCode & 劍指offer刷題】題3:68 節點最低公共祖先

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...) 68 樹中兩個節點的最低公共祖先 題目: 求樹中兩個結點的最低公共祖先 思路: 考慮一下幾種情況: 1、該樹為二叉搜尋樹

搜尋二叉節點的最近公共祖先

搜尋二叉樹中兩個節點的最近公共祖先 Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. According to the

資料結構演算法題/二叉節點的最近公共節點

這個問題可以分為三種情況來考慮: 情況一:root未知,但是每個節點都有parent指標 此時可以分別從兩個節點開始,沿著parent指標走向根節點,得到兩個連結串列,然後求兩個連結串列的第一個公共節點,這個方法很簡單,不需要詳細解釋的。 情況二:節點只有左、右指標,沒有parent指標,roo

二叉節點最低公共節點

問題描述 構建一棵二叉樹(不一定是二叉查詢樹),求出該二叉樹中某兩個結點的最低公共父結點。借用一張圖如下: 最低公共父結點的思路 遞迴,首先從樹根開始考慮: ①結點A 和 結點B 要麼都在樹根的左子樹中;②要麼都在樹根的右子樹中;③要麼一個在左子樹中

求二叉節點的最近公共祖先(三叉鏈,搜尋,普通二叉

求二叉樹中兩個節點的最近公共祖先。 要求:分別考慮以下三種情況        1、二叉樹每個節點有parent(三叉鏈)        2、二叉樹是搜尋二叉樹。        3、就是普通二

二叉節點的最近公共祖先(leetcode)

leetcode題目地址 二叉樹構造 TreeNode* t1 = new TreeNode(3); TreeNode* t2 = new TreeNode(5); TreeNode* t3 = new TreeNode(1);

求二叉節點的最近公共祖先結點

二叉樹是搜尋二叉樹 1、原理:二叉搜尋樹是排序過的 ,位於左子樹的結點都比父結點小,位於右子樹的結點都比父結點大,我們只需從根節點開始和兩個輸入的結點進行比較,如果當前節點的值比兩個結點的值都大,那麼最低的公共祖先結點一定在該結點的左子樹中,下一步開遍歷當前結點的左子樹。如

查詢節點最低公共祖先

求樹中兩個節點的最低公共祖先 給定一棵樹和兩個節點,求解這兩個節點在樹中的最低公共祖先節點。(劍指Offer) 思路: 從根節點遍歷樹,直到要查詢的節點,儲存從根節點到要查詢的節點的路徑。遍歷兩次

二叉問題——尋找二叉節點的最近公共祖先

此題大概分為3種情況: 1、節點中無parent,但提供了root (1)、此種情況又分為兩種,開闢空間,使用容器來儲存路徑,將其轉換為求連結串列公共節點的問題,時間複雜度為O(N),空間複雜度為O(N) (2)、不開闢空間,在節點的左右子樹上尋找兩個節點

求二叉節點的最近公共祖先節點

#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<vector> using std::cin; using std::cout; usi

劍指Offer(第二版)面試案例:節點最低公共祖先節點

劍指Offer(第二版)面試案例:樹中兩個節點的最低公共祖先節點題目:輸入兩個樹節點,求它們的最低公共祖先節點。反問:這棵樹是不是二叉樹?面試官:是二叉樹,並且是二叉搜尋樹。思路:二叉搜尋樹是經過排序的

ODOA(2) 求二叉節點的最大距離(C語言實現)

問題描述; 如果我們把二叉樹看成一個圖,父子節點之間的連線看成是雙向的,我們姑且定義"距離"為兩節點之間邊的個數。寫一個程式求一棵二叉樹中相距最遠的兩個節點之間的距離。 演算法很容易想得到: 如果根節點的左子樹或右子樹為空,那麼最大距離即為樹的深度否則,最大距離等於

求二叉節點最遠的距離

一說到二叉樹,就有很多題目,今天在程式設計之美中看到了二叉樹中兩個節點最遠的距離。所以給想借機寫一篇部落格。 在開始之前,我們先想想,兩個最常節點的最遠距離是怎麼樣的? 情況一:最大距離可能一個在左子

【劍指】試題50 字串第一只出現一次的字元

演算法思想        我們可以考慮實現一個簡單的雜湊表,字元是一個長度為8的資料型別,因此共有256中可能。於是我們建立一個長度為256的陣列,每個字母根據其ASCII嗎值作為陣列的下標對應陣列的