求二叉树中结点的最大距离

“距离”是两结点之间边的个数。求最大距离存在两种情况,一是路径经过左子树的最深结点,通过根结点,再到右子树的最深结点。二是不穿过根结点,二是左子树或右子树的最大距离路径中,取其大者。

问题的核心在于两种不同的情况需要不同的信息,一是需要子树的最大深度,二是需要子树的最大距离。递归代码如下:

先序遍历输入用例:

情况一:abcdh###e##cf#i##g##

情况二:abce###d#f###

//求二叉树中结点的最大距离

#include<iostream>
using namespace std;

typedef struct BiTreeNode{
	int date;
	BiTreeNode *lchild;
	BiTreeNode *rchild;
}*BiTree;

struct Result{
	int maxDepth;//最大深度
	int maxDistance;//最大距离
};

//函数声明
int max(int ld,int rd);
Result GetMaxDistance(BiTreeNode *root);
void CreateBiTree(BiTree &root);

void main()
{
	BiTree root=NULL;
	CreateBiTree(root);
	cout<<"Input end!"<<endl;
	Result res;
	res=GetMaxDistance(root);
	cout<<"MaxDistance="<<max(res.maxDepth,res.maxDistance)<<endl;
}

Result GetMaxDistance(BiTreeNode *root)
{
	if(root==NULL)//递归结束
	{
		Result res={-1,0};//最大深度为-1,因为之后还要对其加1然后变为0
		return res;
	}
	Result ls=GetMaxDistance(root->lchild);//左子树
	Result rs=GetMaxDistance(root->rchild);//右子树
	Result res;
	res.maxDepth=max(ls.maxDepth,rs.maxDepth)+1;//左子树和右子树中最大深度加1
	//求最大距离,返回第一个参数表示最大距离经过根结点,返回第二个参数表示最大距离不经过根结点
	res.maxDistance=max(ls.maxDepth+rs.maxDepth+2,max(ls.maxDistance,rs.maxDistance));
	return res;
}

int max(int ld,int rd)//返回最大值
{
	return ld > rd ? ld: rd;
}

void CreateBiTree(BiTree &root)//先序创建一课二叉树
{
	char data;
	data=getchar();
	if(data=='#')//输入'#'表示为空,递归结束
		root=NULL;
	else
	{
		root=new BiTreeNode();//新建一个结点
		root->date=data;
		CreateBiTree(root->lchild);
		CreateBiTree(root->rchild);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值