以下程序未经测试,仅供参考!
#include <iostream>
#include <vector>
using namespace std;
struct LCATreeNode{
LCATreeNode* m_pLeft;
LCATreeNode* m_pRight;
int m_value;
}
bool nodePath(LCATreeNode* root, int value, vector<LCATreeNode*>& v){
if(!root) return false;
if(root->m_value != value){
if(nodePath(root->m_pLeft,value,v)||nodePath(root->m_pRight,value,v)){
v.push_back(root);
return true;
}else
return false;
}else{
v.push_back(root);
return true;
}
}
LCATreeNode* findLCA(LCATreeNode* root, int value1,int value2){
if(!root) return null;
vector<LCATreeNode*> v1;
vector<LCATreeNode*> v2;
bool find = nodePath(root,value1,v1);
find &= nodePath(root,value2,v2);
if(find){
int min = v1.size()<v2.size()?v1.size():v2.size();
for(int i = v1.size()-min, j = v2.size()-min; i < v1.size(); i++,j++){
if(v1[i]==v2[j])
return v1[i];
}
}
return null;
}
该程序的思路就是,首先求出两个叶节点的路径,将其分别保存在两个向量中,从同一层开始判断是否有公共子节点。其实这个已经和两个链表中第一个公共节点的题目很相似了!反正思路是一样的。
该问题有以下几个变体:
1)求任意两个叶节点最长的距离。只要对公共部分进行计数a,两个叶节点的距离分别是l1,l2则最长距离为 l1+l2-2*a
2)求二叉搜索树的任意两个节点的公共父节点。这里要注意利用二叉搜索树的特性,即任意两个叶节点的父节点的值一定是在这两个叶节点值得中间,因此代码如下所示,同样未经验证,仅供参考!
LCATreeNode* findLCA_1(LCATreeNode* root, int value1, int value2){
LCATreeNode* tmp = root;
while(tmp){
if(tmp->m_value>value1 && tmp->m_value>value2)
tmp = tmp->m_pLeft;
else if(tmp->m_value<value1 && tmp->m_value<value2)
tmp = tmp->m_pRight;
else
return tmp;
}
return null;
}