面试题68:树中两个结点的最低公共祖先
题目:输入两个树结点,求它们的最低公共祖先。
一:若树为二叉搜索树
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct TreeNode{
int Value;
TreeNode* left;
TreeNode* right;
} ;
TreeNode* GetLastCommonParent ( TreeNode* pRoot, TreeNode* pNode1, TreeNode* pNode2) {
if ( TreeNode== NULL || pNode1== NULL || pNode2== NULL ) return NULL ;
if ( pRoot- > Value> pNode1- > Value && pRoot- > Value> pNode2- > Value) return GetLastCommonParent ( pRoot- > left, pNode1, pNode2) ;
if ( pRoot- > Value< pNode1- > Value && pRoot- > Value< pNode2- > Value) return GetLastCommonParent ( pRoot- > right, pNode1, pNode2) ;
return pRoot;
}
int main ( ) {
return 0 ;
}
二:若树为普通的树,有指向父节点的指针
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct TreeNode{
int Value;
vector< TreeNode* > Children;
TreeNode* Parent;
} ;
unsigned int GetListLength ( TreeNode* pNode) {
unsigned int nLen= 0 ;
TreeNode* pTemp= pNode;
while ( pTemp!= NULL ) {
nLen++ ;
pTemp= pTemp- > Parent;
}
return nLen;
}
TreeNode* GetLastCommonParent ( TreeNode* pNode1, TreeNode* pNode2) {
if ( pNode1== NULL || pNode2== NULL ) return NULL ;
unsigned int len1= GetListLength ( pNode1) ;
unsigned int len2= GetListLength ( pNode2) ;
int nlengthDiff= len1- len2;
TreeNode* pListHeadLong= pNode1;
TreeNode* pListHeadShort= pNode2;
if ( len1< len2) {
pListHeadLong= pNode2;
pListHeadShort= pNode1;
nlengthDiff= len2- len1;
}
for ( int i= 0 ; i< nlengthDiff; i++ ) pListHeadLong= pListHeadLong- > Parent;
while ( pListHeadLong!= NULL && pListHeadShort!= NULL && pListHeadLong!= pListHeadShort) {
pListHeadLong= pListHeadLong- > Parent;
pListHeadShort= pListHeadShort- > Parent;
}
TreeNode* p= pListHeadLong;
return p;
}
int main ( ) {
return 0 ;
}
三:若树为普通的树,没有指向父节点的指针
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct TreeNode{
int Value;
vector< TreeNode* > Children;
} ;
bool GetNodePath ( TreeNode* pRoot, TreeNode* pNode, list< TreeNode* > & path) {
if ( pRoot== NULL ) return true ;
path. push_back ( pRoot) ;
bool found= false ;
vector< TreeNode* > :: iterator it= pRoot- > Children. begin ( ) ;
while ( ! found && it!= pRoot- > Children. end ( ) ) {
found= GetNodePath ( * it, pNode, path) ;
it++ ;
}
if ( ! found) path. pop_back ( ) ;
return found;
}
TreeNode* GetLastCommonNode ( const list< TreeNode* > & path1, const list< TreeNode* > & path2) {
list< TreeNode* > :: const_iterator it1= path1. begin ( ) ;
list< TreeNode* > :: const_iterator it2= path2. begin ( ) ;
TreeNode* pLast= NULL ;
while ( it1!= path1. end ( ) && it2!= path2. end ( ) ) {
if ( * it1== * it2) pLast= * it1;
it1++ ;
it2++ ;
}
return pLast;
}
TreeNode* GetLastCommonParent ( TreeNode* pRoot, TreeNode* pNode1, TreeNode* pNode2) {
if ( pRoot== NULL || pNode1== NULL || pNode2== NULL ) return NULL ;
list< TreeNode* > path1;
GetNodePath ( pRoot, pNode1, path1) ;
list< TreeNode* > path2;
GetNodePath ( pRoot, pNode2, path2) ;
return GetLastCommonNode ( path1, path2) ;
}
int main ( ) {
return 0 ;
}