题目链接:点击查看
题目描述:
求一个二叉树的最长直径。直径的定义是二叉树上任意两节点之间的无向距离。
输入输出:
给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
题目分析:
解题时要注意,在我们处理某个子树时,我们更新的最长直径值和递归返回的值是不同的。这是因为待更新的最长直径值是经过该子树根节点的最长直径(即两侧长度);而函数返回值是以该子树根节点为端点的最长直径值(即一侧长度),使用这样的返回值才可以通过递归更新父节点的最长直径值。
代码:
int diameterOfBinaryTree(TreeNode *root)
{
int diameter=0;
helper(root,diameter);
return diameter;
}
int helper(TreeNode *node,int &diameter)
{
if(!node)
{
return 0;
}
int l=helper(node->left,diameter),r=helper(node->right,diameter);
diameter=max(l+r,diameter);//diameter传递的是引用 即在原值上进行修改 直径是根节点的两侧长度相加
return max(l,r)+1;//在此返回值的作用是处理递归结果
}