二叉搜索树的最近公共祖先

提示:此生尽兴 赤诚善良

文章目录

  • 二叉搜索树的最近公共祖先
    • 思路
    • 递归
    • 迭代
    • 可执行
  • 运行截图


二叉搜索树的最近公共祖先

二叉搜索树的最近公共祖先_第1张图片

思路

本题依然可以按照上一题一样处理 但是为了体现二叉树搜索树的特点,因为二叉树是有序的,所有这里在p q 区间中的结点就是公共结点 但是你要考虑在P q区间中的结点可能是不止一个 是要第一个还是继续向下深入呢,这里认为第一个在此区间的 以为这一个结点已经将p q 分成两个区域了,下面深入的过程中 不会存在另外一个结点再一次同时连接两个树了 基于此我们写递归函数

递归

BiTree* PreFindAncient(BiTree* T){
	if(T->data<=val1&&T->data>=val2||(T->data>=val1&&T->data<=val2)){return T;};
	if(val1>val2){
		if(T->data>val1) return PreFindAncient(T->Lchild);
		else return PreFindAncient(T->Rchild);
	}else{
		if(T->data>val2) return PreFindAncient(T->Lchild);
		else return PreFindAncient(T->Rchild);		
	}
}

迭代

BiTree* RePreFindAncient(BiTree* T){
	stack<BiTree*> S;
	if(T==NULL) return NULL ;  
	S.push(T); 
	 while(!S.empty()){//要再进入的while的时候不为空为空 ,则需要前面就加入结点
	 	T=S.top(); 
	 	S.pop(); 
	 	if(T->data<=val1&&T->data>=val2||(T->data>=val1&&T->data<=val2)) return T;
		if(T->Rchild!=NULL&&T->data<val1)S.push(T->Rchild);
		else S.push(T->Lchild);	
	} 	
} 

可执行

#include
typedef struct BiTree{
	int data;
	BiTree* Lchild=NULL;
	BiTree* Rchild=NULL; 
}BiTree;
typedef struct Node{
	BiTree *T;
	int sum=0;
}Node;
using namespace std;
int X;int val1;int val2;
vector<BiTree*> result1,result2;
void PreCreatTree(BiTree* &T){//前序创造一个树 
	int input;cin>>input;
	if(input==-1){
		T=NULL;
	}
	else{
		T=(BiTree*)malloc(sizeof(BiTree));
		T->data=input;
		PreCreatTree(T->Lchild);
		PreCreatTree(T->Rchild);
	}
}
void PreTravel(BiTree* T){
	if(T==NULL){return ;}
	cout<<T->data<<" ";
	PreTravel(T->Lchild);
	PreTravel(T->Rchild);
}
BiTree* PreFindAncient(BiTree* T){
	if(T->data<=val1&&T->data>=val2||(T->data>=val1&&T->data<=val2)){return T;};
	if(val1>val2){
		if(T->data>val1) return PreFindAncient(T->Lchild);
		else return PreFindAncient(T->Rchild);
	}else{
		if(T->data>val2) return PreFindAncient(T->Lchild);
		else return PreFindAncient(T->Rchild);		
	}
}
BiTree* RePreFindAncient(BiTree* T){
	stack<BiTree*> S;
	if(T==NULL) return NULL ;  
	S.push(T); 
	 while(!S.empty()){//要再进入的while的时候不为空为空 ,则需要前面就加入结点
	 	T=S.top(); 
	 	S.pop(); 
	 	if(T->data<=val1&&T->data>=val2||(T->data>=val1&&T->data<=val2)) return T;
		if(T->Rchild!=NULL&&T->data<val1)S.push(T->Rchild);
		else S.push(T->Lchild);	
	} 	
} 
int main(){
	BiTree* T;
	cout<<"请输入结点,其中空结点使用-1 代替"<<endl;
	PreCreatTree(T);
	PreTravel(T);cout<<endl;
	while(1){
		cout<<"请输入两个值,其中前一个值较大"<<endl;
		cin>>val1>>val2;
		cout<<"方式一中此时的公共祖先是"<<PreFindAncient(T)->data<<endl;
		cout<<"方式二中此时公共结点是"<<RePreFindAncient(T)->data<<endl;		
	}
}

运行截图

二叉搜索树的最近公共祖先_第2张图片
csdn
在这种困难的抉择下,本人思来想去,寝食难安。 废话,发生了会如何,不发生又会如何。 既然如此, 我认为, 每个人都不得不面对这些问题。 在面对这种问题时, 本人也是经过了深思熟虑,在每个日日夜夜思考这个问题。 我们不得不面对一个非常尴尬的事实,那就是, 在这种困难的抉择下,本人思来想去,寝食难安。 废话的发生,到底需要如何做到,不废话的发生,又会如何产生。 莎士比亚在不经意间这样说过,意志命运往往背道而驰,决心到最后会全部推倒。我希望诸位也能好好地体会这句话。 伏尔泰曾经说过,坚持意志伟大的事业需要始终不渝的精神。这启发了我, 总结的来说, 经过上述讨论亚伯拉罕·林肯在不经意间这样说过,我这个人走得很慢,但是我从不后退。

你可能感兴趣的:(数据结构,算法)