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

情况二:节点只有左、右指针,没有parent指针,root已知
思路:有两种情况,一是要找的这两个节点(a, b),在要遍历的节点(root)的两侧,那么这个节点就是这两个节点的最近公共父节点;
二是两个节点在同一侧,则 root->left 或者 root->right 为 NULL,另一边返回a或者是b。那么另一边返回的就是他们的最小公共父节点。
递归有两个出口,一是没有找到a或者b,则返回NULL;二是只要碰到a或者b,就立刻返回。

 

typedef struct BiTNode
{
	int data;
	struct BiTNode* lchild;
	struct BiTNode* rchild;
}*BiTree;
BiTree findanstorab(BiTree root,BiTree a,BiTree b)
{
	if(root==a || root==b)
		return root;
	if(root==NULL)
		return NULL;
	BiTree leftChild=findanstorab(root->lchild,a,b);
	BiTree rightChild=findanstorab(root->rchild,a,b);
	if(leftChild&&rightChild)
		return root;
	return leftChild?leftChild:rightChild;
}
void CreateTree(BiTree& T)
{
	T=(BiTree)malloc(sizeof(BiTNode));
	scanf("%d",&T->data);
	if(T->data==0)
	{
		T->lchild=NULL;
		T->rchild=NULL;
		return;
	}
	CreateTree(T->lchild);
	CreateTree(T->rchild);
}
void PreOrderTraverse(BiTree T)
{
	if(T)
	{
		cout<<T->data<<" ";
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}
}
int main()
{
	BiTree T;
	CreateTree(T);
	PreOrderTraverse(T);
	cout<<endl;
	BiTree a=T->lchild->lchild;
	BiTree b=T->lchild->rchild;
	cout<<findanstorab(T,a,b)->data<<endl;

	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值