//求二叉树中两个结点的最低公共祖先结点
//获取结点的路径
bool get_node_path(node* root,node* treenode,deque<node*> &path){
if(root == NULL){
return false;
}
//如果找到了将结点保存起来
if(root == treenode){
path.push_back(root);
return true;
}
//如果没有找到则寻找
path.push_back(root);
//看看左子树是否有该节点
bool found = get_node_path(root->left,treenode,path);
//如果左子树没有找到该节点,则在右子树中寻找
if(!found)
found = get_node_path(root->right,treenode,path);
//如果左右子树都没找到,则将之前保留的数据从容器中删除
if(!found)
path.pop_back();
//返回寻找的结果0
return found;
}
//获得公共节点
node* get_common_node(node* root,deque<node*> &pathA,deque<node*> &pathB){
if(root == NULL){
return NULL;
}else if(!root->left && !root->right){
return root;
}
deque<node*>::iterator iterA = pathA.begin();
deque<node*>::iterator iterB = pathB.begin();
node* common_node = NULL;
while(iterA!=pathA.end() && iterB!=pathB.end()){
if(*iterA == *iterB){
common_node = *iterA;
}
iterA++;
iterB++;
}
return common_node;
}
//整合函数
node* getLastParent(node* root,node* A,node* B){
deque<node*> resultA;
deque<node*> resultB;
node* common;
if(get_node_path(root,A,resultA) &&
get_node_path(root,B,resultB)){
common = get_common_node(root,resultA,resultB);
}
return common;
}
测试:
int main(){
node *root = new node(9);
root->left = new node(4);
root->left->left = new node(1);
root->left->right = new node(5);
root->right = new node(15);
root->right->left = new node(10);
root->right->right = new node(17);
root->right->right->left = new node(16);
node *q = getLastParent(root,root->left,root->left);
if(!q)
cout<<q->key<<endl;
system("pause");
return 0;
}