二叉树中两个节点的最近公共父节点 使用二叉排序树

以下是我的算法之后是Hackbuteer1的算法 Hack的算法更加好。

 

BiTree al=NULL,ar=NULL;
BiTree FindAnstorBST(BiTree T,BiTree a,BiTree b)
{
	if(T)
	{
		if(T->value>a->value && T->value<b->value)
			return T;
		if(T->value<a->value && T->value<b->value)
		{
			 al=FindAnstorBST(T->rChild,a,b);
		}
		if(T->value>a->value && T->value>b->value)
		{
			 ar=FindAnstorBST(T->lChild,a,b);
		}
		if(al!=NULL)
			return al;
		if(ar!=NULL)
			return ar;
		return NULL;
	}
	return NULL;
}
BiTree find(BiTree root,BiTree a,BiTree b)
{
	while(root)
	{
		if(root->value>a->value&&root->value<b->value)
			return root;
		else if(root->value>a->value && root->value>b->value)
			root=root->lChild;
		else if(root->value<a->value&& root->value<b->value)
			root=root->rChild;
	}
	return NULL;
}
int main()
{
	BiTree T=NULL;
	int i;

	while(scanf("%d",&i)!=EOF)
		InsertBST(T,i);
	InOrderTraverse(T);
	cout<<endl;
	//cout<<FindAnstorBST(T,T->lChild->lChild,T->rChild)->value<<endl;
	cout<<find(T,T->lChild->lChild,T->rChild)->value<<endl;
	return 0;
}


http://blog.csdn.net/Hackbuteer1/article/list/1

 

以下是用到的数据结构和一些插入节点的操作

 

typedef struct BiTNode
{
	int value;
	struct BiTNode *lChild,*rChild;
}*BiTree;
bool LT(int a,int b)
{
	return a<b?true:false;
}
bool SearchBST(BiTree root,int data,BiTree f,BiTree& p)
{
	if(!root)
	{
		p=f;
		return false;
	}
	else if(data==root->value)
	{
		p=root;
		return true;
	}
	else if(data<root->value)
	{
		return SearchBST(root->lChild,data,root,p);
	}
	else if(data>root->value)
		return SearchBST(root->rChild,data,root,p);
}
void InsertBST(BiTree& root,int data)
{
	BiTree p,s;
	if(!SearchBST(root,data,NULL,p))
	{
		s=(struct BiTNode*)malloc(sizeof(BiTNode));
		s->value=data;
		s->lChild=s->rChild=NULL;
		if(p==NULL)
			root=s;
		else if(LT(data,p->value))
		{
			p->lChild=s;
		}
		else 
			p->rChild=s;
	}
	return;
}
void PreOrderTraverse(BiTree root)
{
	if(root)
	{
		cout<<root->value<<" ";
		PreOrderTraverse(root->lChild);
		PreOrderTraverse(root->rChild);
	}
}
void InOrderTraverse(BiTree root)
{
	if(root)
	{
		InOrderTraverse(root->lChild);
		cout<<root->value<<" ";
		InOrderTraverse(root->rChild);
	}
}
void PostOrderTraverse(BiTree root)
{
	if(root)
	{
		PostOrderTraverse(root->lChild);
		PostOrderTraverse(root->rChild);
		cout<<root->value<<" ";
	}
}
void DeleteBST(BiTree root)
{
	if(root)
	{
		DeleteBST(root->lChild);
		DeleteBST(root->rChild);
		free(root);
	}
}
	void Delete(BiTree &p)
	{
		//从二叉树排序树中删除节点p,并且重新连接他的左或右子树
		BiTree q;
		BiTree s;
		if(!p->rChild)//节点的右子树为空 只需要连接他的左子树
		{
			q=p;
			p=p->lChild;
			delete q;
		}
		else if(!p->lChild)//左子树为空 只需要连接他的右子树即可
		{
			q=p;
			p=p->rChild;
			delete q;
		}
		else//左右子树都不空
		{
			q=p;
			s=p->lChild;
			while(s->rChild)//找到左边的子树的最右边节点
			{
				q=s;//q指向最右边节点的父节点
				s=s->rChild;
			}
			p->value=s->value;//用删除节点的前驱来代替他
			if(q!=p)
			{
				q->rChild=s->lChild;//连接s的左子树
			}
			else
				q->lChild=s->lChild;//连接s的左子树
			delete s;
		}
		return;
	}
	void DeleteBSTKey(BiTree &T,int key)
	{
		///若二叉排序树中存在Key,则删除之
		if(!T)
			return;
		else
		{
			if(key==T->value)
			{
				return Delete(T);
			}
		}
		if(key<T->value)
			return DeleteBSTKey(T->lChild,key);
		else
			return DeleteBSTKey(T->rChild,key);
	}


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值