二叉树最近公共父节点

本文介绍了如何在二叉树结构中查找两个指定子节点的最近公共父节点,并通过实现方法详细阐述了路径查找及最近公共父节点的确定过程。

在二叉树中,查找两个子节点的最近公共父节点。实现方法:首先找到每个子节点的路径,然后再比较两个路径最后一个相同节点,既最近公共父节点。

二叉树的数据结构如下

typedef struct _node
{
	char data;
	struct _node* lchild;
	struct _node* rchild;
}node;

查找子节点的路径,利用链表list来实现

bool findNodePath(node* root, char elem, list<node*> &path)
{
	if (!root) return false;
	path.push_back(root);
	if (elem==root->data) return true;
	if(findNodePath(root->lchild,elem,path)) return true;
	if(findNodePath(root->rchild,elem,path)) return true;
	path.pop_back();
	return false;
}

利用上述findNodePath函数,就可以很容易得到最近公共父节点

node* findNearestParent(node* root, char elem1, char elem2) 
{
	list<node*> path1,path2;
	if (findNodePath(root,elem1,path1)&&findNodePath(root,elem2,path2))
	{
		list<node*>::iterator iter1=path1.begin();
		list<node*>::iterator iter2=path2.begin();
		while(*iter1==*iter2)
		{
			iter1++;
			iter2++;
		}
		return *(--iter1);
	}
	return NULL;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值