问题:给定一个二叉搜索树中的两个节点的值,找到最近的共同祖先。你可以假定树中存在这两个值。
解题:
(1)有一个简单而直观的算法,从每个节点开始沿着树向上,直到它们汇聚。对两个节点都生成其所在祖先节点的链表,然后在这两个链表中搜索,以找到第一个不同的结点。这个差异的结点的前一个结点就是最近共同祖先。
(2)考虑二叉搜索树的特性:左子结点的值小于或者等于当前结点的值,右结点的值大于或者等于当前结点的值。根结点时所有其他节点的祖先结点,因为从它到所有其他节点都有路径。因此,从根节点开始,顺着这两个结点的共同祖先结点往下找。当两个目标结点的值都小于当前结点时,向左走。当两个目标结点的值都大于当前结点时,向右走。其他情况,也就是当前结点的值介于两个目标结点之间,则当前结点就是最近共同祖先。
#include <iostream>
using namespace std;
struct Node
{
int data;//数据域
Node* left;//指向左孩子的指针
Node* right;//指向右孩子的指针
};
struct node{
int data;
node* next;
};
class BinarySearchTree{
private:
Node* root;//根节点
private:
//插入一个结点
void Insert(Node* s,Node* &node){
if (node == NULL){
node = s;
}
else{
if (s->data < node->data)
Insert(s, node->left);
else
Insert(s, node->right);
}
}
public:
BinarySearchTree(){
root = NULL;
}
//创建一棵二查搜索树
void CreatePre(){
int data;
while (cin >> data){
Node* s = new Node;
s->data = data;
s->left = s->right = NULL;
Insert(s, root);
}
cin.clear();
}
void findLowestCommonAncestor1(int child1,int child2){
node* p = new node;
node* p1 = p;
node* q = new node;
node* q1 = q;
Node* tmp = root;
node*a, *b;
while (tmp!=NULL&&tmp->data != child1){
node* a = new node;
a->data = tmp->data;
p1->next = a;
a->next = NULL;
p1 = a;
if (child1 < tmp->data){
tmp = tmp->left;
}
else{
tmp = tmp->right;
}
}
a = new node;
a->data = child1;
p1->next = a;
a->next = NULL;
tmp = root;
while (tmp != NULL&&tmp->data != child2){
node* b = new node;
b->data = tmp->data;
q1->next = b;
b->next = NULL;
q1 = b;
if (child2 < tmp->data){
tmp = tmp->left;
}
else{
tmp = tmp->right;
}
}
b = new node;
b->data = child2;
q1->next = b;
b->next = NULL;
p1 = p->next;
q1 = q->next;
node* temp=p;
while (p1 != NULL&&q1 != NULL){
if (p1->data == q1->data){
p1 = p1->next;
q1 = q1->next;
temp = temp->next;
}
else{
break;
}
}
cout << "The Lowest Common Ancestor is " << temp->data << endl;
}
void findLowestCommonAncestor2(int child1, int child2){
Node* tmp = root;
while (tmp != NULL){
int value = tmp->data;
if (value > child1&&value > child2){
tmp = tmp->left;
}
else if (value < child1&&value < child2){
tmp = tmp->right;
}
else{
cout << "The Lowest Common Ancestor is " << tmp->data << endl;
return;
}
}
cout << "No Ancestor!" << endl;
}
};
int main(){
BinarySearchTree bst;
bst.CreatePre();
int a, b;
cout << "Please input the two child:";
cin >> a >> b;
bst.findLowestCommonAncestor1(a, b);
bst.findLowestCommonAncestor2(a, b);
return 0;
}