最近共同祖先

问题:给定一个二叉搜索树中的两个节点的值,找到最近的共同祖先。你可以假定树中存在这两个值。

解题:

(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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值