求一颗树任意两个节点的距离

这个题可以先画树来看看,要知道它们共同的父亲就好了,可是共同父亲怎么知道呢?那我们从它的左子树和右子树找这两个节点。

来看个图比较好理解点吧,

如果当前节点是两个节点的共同父亲,或者是图中那种描述呢

直接来看C++代码吧

typedef struct Node{
	Node* left;
	Node* right;
	int val;
	Node(int v):val(v),left(NULL),right(NULL){}
}Node,*pNode;


int NodeDistance(pNode root,pNode first,pNode second,int &dist)
{
	if(root==NULL)
		return 0;
	int va=0;
	if(root==first||root==second)
		va=1;
	int valeft=NodeDistance(root->left,first,second,dist);
	int varight=NodeDistance(root->right,first,second,dist);
	if(!dist)
	{		
		if(valeft*va||varight*va||varight*valeft)
		{
			dist=varight+valeft;
			return 0;
		}
		else
			if(va||varight||valeft)
				return va?va:varight+valeft+1;
	}
	return 0;
}
最后给个测试用例吧

void  main()
{
	pNode root=new Node(1);
	root->left=new Node(2);
	root->right=new Node(3);
	root->left->left=new Node(6);
	root->left->right=new Node(7);
	root->right->left=new Node(8);
	root->right->right=new Node(9);
	root->left->left->right=new Node(10);
	root->left->left->left=new Node(11);
	root->right->left->left=new Node(12);
	root->right->left->left->right=new Node(13);

	int d=0;
	NodeDistance(root,root->right->left->left->right,root->left->right,d);
	while(1);
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值