“距离”是两结点之间边的个数。求最大距离存在两种情况,一是路径经过左子树的最深结点,通过根结点,再到右子树的最深结点。二是不穿过根结点,二是左子树或右子树的最大距离路径中,取其大者。
问题的核心在于两种不同的情况需要不同的信息,一是需要子树的最大深度,二是需要子树的最大距离。递归代码如下:
先序遍历输入用例:
情况一: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);
}
}