查詢樹中兩個節點的最低公共祖先
求樹中兩個節點的最低公共祖先
給定一棵樹和兩個節點,求解這兩個節點在樹中的最低公共祖先節點。(劍指Offer)
思路:
從根節點遍歷樹,直到要查詢的節點,儲存從根節點到要查詢的節點的路徑。遍歷兩次樹,即儲存了根節點到要查詢的兩個節點的兩條路徑,然後求出兩條路徑的最後一個交點即可。
C++程式碼實現:
#include <iostream>
#include <vector>
#include <list>
using namespace std;
typedef struct TreeNode{
int data;
struct TreeNode *leftChild;
struct TreeNode *rightChild;
}TreeNode, *BiTree;
bool GetNodePath(TreeNode* pRoot, int data, list<BiTree> &path){
if(pRoot == NULL){
return false;
}
if(pRoot->data == data){
return true;
}
path.push_back(pRoot);
bool found = false ;
if(!found){
found = GetNodePath(pRoot->leftChild, data, path);
}
if(!found){
found = GetNodePath(pRoot->rightChild, data, path);
}
if(!found){
path.pop_back();
}
return found;
}
BiTree GetLastCommonNode(list<BiTree> &path1, list <BiTree> &path2){
list<BiTree>::const_iterator i1 = path1.begin();
list<BiTree>::const_iterator i2 = path2.begin();
BiTree pLast = NULL;
for(;i1!=path1.end() && i2!=path2.end();){
if(*i1 == *i2){
pLast = *i1;
}
++i1;
++i2;
}
return pLast;
}
BiTree GetLastCommonParent(TreeNode* pRoot, int data1, int data2){
if(pRoot == NULL){
return NULL;
}
list<BiTree> path1, path2;
GetNodePath(pRoot, data1, path1);
GetNodePath(pRoot, data2, path2);
return GetLastCommonNode(path1, path2);
}
int creatTree(BiTree &T){
int data;
cin >> data;
if(data == -1){
T = NULL;
return 0;
}else{
T = (BiTree)malloc(sizeof(TreeNode));
T->data = data;
creatTree(T->leftChild);
creatTree(T->rightChild);
}
return 0;
}
int main(int argc, const char * argv[]) {
// insert code here...
BiTree T, result;
int data1, data2;
creatTree(T);
cin >> data1 >> data2;
result = GetLastCommonParent(T, data1, data2);
cout << result->data << endl;
return 0;
}
相關推薦
查詢樹中兩個節點的最低公共祖先
求樹中兩個節點的最低公共祖先 給定一棵樹和兩個節點,求解這兩個節點在樹中的最低公共祖先節點。(劍指Offer) 思路: 從根節點遍歷樹,直到要查詢的節點,儲存從根節點到要查詢的節點的路徑。遍歷兩次
樹中兩結點的最低公共祖先(C++實現)
題目是,輸入兩個樹結點,求它們的最低公共祖先 首先,要說明的是,這是一組題目,根據劍指Offer上所講的,這道題可能會分好幾種情況,因此,如果在面試時候遇到,我們需要和麵試官溝通,而不是一上來就寫程式碼。 1. 如果給定樹是二叉搜尋樹 二叉
求樹中兩個節點的最低公共祖先節點(go)
該題目有以下幾種情況可以考慮 1. 樹是二叉搜尋樹,二叉搜尋樹的特點是根節點值大於所有左子樹節點值,小於所有右子樹節點值,則最低公共祖先即該節點值大於給定兩個節點中的一個值,小於另外一個節點的值,go程式碼實現如下 type TreeNode struct { Val int Lef
面試題50 樹中兩個節點的最低公共祖先LCA(Lowest Common Ancestor )
題目是樹的最低公共祖先,我們先來考慮樹是什麼樹? 我們從最簡單的情況開始分析。 情況一:是二叉樹,且是二叉搜尋樹(二叉排序樹,二叉查詢樹) 分析:由於二叉排序樹具有這樣的特點:若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右
【LeetCode & 劍指offer刷題】樹題3:68 樹中兩個節點的最低公共祖先
【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...) 68 樹中兩個節點的最低公共祖先 題目: 求樹中兩個結點的最低公共祖先 思路: 考慮一下幾種情況: 1、該樹為二叉搜尋樹
二叉樹中兩個節點的最低公共父節點
問題描述 構建一棵二叉樹(不一定是二叉查詢樹),求出該二叉樹中某兩個結點的最低公共父結點。借用一張圖如下: 最低公共父結點的思路 遞迴,首先從樹根開始考慮: ①結點A 和 結點B 要麼都在樹根的左子樹中;②要麼都在樹根的右子樹中;③要麼一個在左子樹中
劍指Offer(第二版)面試案例:樹中兩個節點的最低公共祖先節點
劍指Offer(第二版)面試案例:樹中兩個節點的最低公共祖先節點題目:輸入兩個樹節點,求它們的最低公共祖先節點。反問:這棵樹是不是二叉樹?面試官:是二叉樹,並且是二叉搜尋樹。思路:二叉搜尋樹是經過排序的
面試題之樹中兩個節點的最低公共祖先節點
1.樹為二叉搜尋樹,二叉搜尋樹特點:值:右>根>左 ①思路 從根節點開始遍歷 a:若該節點值比所給兩個節點均大,則公共祖先節點必在其左子樹上,遍歷其左子樹。 b:若該節點值比所給兩個節點均小,則公共祖先節點必在其右子樹上,遍歷其右子樹。 c:直到找到一個節點,位
二叉樹應用_樹中兩個節點的最低公共祖先
題目:給定樹中的兩個節點,找出這兩個節點的最低公共祖先。 情況1:當給定的樹為二叉搜尋樹時。 分析:由於二叉搜尋樹是排序過的,位於左子樹的節點都小於根節點,位於右子樹的節點都大於根節點。如果要查詢的兩個節點比根節點大的話,則最低公共祖先在右子樹中;如果要查詢
樹中兩個節點的最低公共祖先
樹是二叉查詢樹的情況 題目來自LeetCode:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/ Lowest Common Ancestor of a
程式設計師面試100題之十六 二叉樹中兩個節點的最近公共父節點
這個問題可以分為三種情況來考慮:情況一:root未知,但是每個節點都有parent指標此時可以分別從兩個節點開始,沿著parent指標走向根節點,得到兩個連結串列,然後求兩個連結串列的第一個公共節點,這個方法很簡單,不需要詳細解釋的。情況二:節點只有左、右指標,沒有parent
《程式設計師面試金典》--尋找二叉樹中兩個節點的第一個公共祖先(三種情況)
/**************************************************************************************************
搜尋二叉樹中兩個節點的最近公共祖先
搜尋二叉樹中兩個節點的最近公共祖先 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
求二叉樹中兩個節點的最近公共祖先(三叉鏈,搜尋樹,普通二叉樹)
求二叉樹中兩個節點的最近公共祖先。 要求:分別考慮以下三種情況 1、二叉樹每個節點有parent(三叉鏈) 2、二叉樹是搜尋二叉樹。 3、就是普通二
二叉樹中兩個節點的最近公共祖先(leetcode)
leetcode題目地址 二叉樹構造 TreeNode* t1 = new TreeNode(3); TreeNode* t2 = new TreeNode(5); TreeNode* t3 = new TreeNode(1);
求二叉樹中兩個節點的最近公共祖先結點
二叉樹是搜尋二叉樹 1、原理:二叉搜尋樹是排序過的 ,位於左子樹的結點都比父結點小,位於右子樹的結點都比父結點大,我們只需從根節點開始和兩個輸入的結點進行比較,如果當前節點的值比兩個結點的值都大,那麼最低的公共祖先結點一定在該結點的左子樹中,下一步開遍歷當前結點的左子樹。如
二叉樹問題——尋找二叉樹中兩個節點的最近公共祖先
此題大概分為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
二叉樹中兩個節點的最近公共父節點
轉載:http://blog.csdn.net/hackbuteer1/article/details/8022138# 這個問題可以分為四種情況來考慮:情況一:root未知,但是每個節點都有parent指標此時可以分別從兩個節點開始,沿著parent指標走向根節點,得到兩