树是查找二叉树
也就是树是排序过的,位于左子树上的结点都比父结点小,而位于右子树的结点都比父结点大。我们只需要从根结点开始和两个结点进行比较。如果当前结点的值比两个结点都大,则最低的共同父结点一定在当前结点的左子树中。如果当前结点的值比两个结点都小,则最低的共同父结点一定在当前结点的右子树中。
树不一定是二叉树,每个结点都有一个指针指向它的父结点
我们可以从任何一个结点出发,得到一个到达树根结点的单向链表。因此这个问题转换为两个单向链表的第一个公共结点。
一般树
找到两棵树的路径,遍历找公共节点
1 bool GetNodePath(TreeNode* pRoot, TreeNode* pNode, list<TreeNode*>& path) 2 { 3 if(pRoot == pNode) 4 return true; 5 6 path.push_back(pRoot); 7 8 bool found = false; 9 10 vector<TreeNode*>::iterator i = pRoot->m_vChildren.begin(); 11 while(!found && i < pRoot->m_vChildren.end()) 12 { 13 found = GetNodePath(*i, pNode, path); 14 ++i; 15 } 16 17 if(!found) 18 path.pop_back(); 19 20 return found; 21 } 22 23 TreeNode* GetLastCommonNode 24 ( 25 const list<TreeNode*>& path1, 26 const list<TreeNode*>& path2 27 ) 28 { 29 list<TreeNode*>::const_iterator iterator1 = path1.begin(); 30 list<TreeNode*>::const_iterator iterator2 = path2.begin(); 31 32 TreeNode* pLast = NULL; 33 34 while(iterator1 != path1.end() && iterator2 != path2.end()) 35 { 36 if(*iterator1 == *iterator2) 37 pLast = *iterator1; 38 39 iterator1++; 40 iterator2++; 41 } 42 43 return pLast; 44 } 45 46 TreeNode* GetLastCommonParent(TreeNode* pRoot, TreeNode* pNode1, TreeNode* pNode2) 47 { 48 if(pRoot == NULL || pNode1 == NULL || pNode2 == NULL) 49 return NULL; 50 51 list<TreeNode*> path1; 52 GetNodePath(pRoot, pNode1, path1); 53 54 list<TreeNode*> path2; 55 GetNodePath(pRoot, pNode2, path2); 56 57 return GetLastCommonNode(path1, path2); 58 }