题意理解
求二叉树从一个叶子到另一个叶子的路径最大值,必然经过根节点
问题分析
递归
先计算子树的深度,然后用左右子树深度和+1
其他
最大子树不一定经过根结点。可以是任意一个子树的最大直径。
链接
int diameterOfBinaryTree(TreeNode* root) {
int depth = 0, maxDiameter = 1; //最大直径默认为1,处理空树情况下直径0
helper(root, depth, maxDiameter);
return maxDiameter - 1; //-1为了支持空树
}
void helper(TreeNode* root, int& depth, int& maxDiameter) //参数1:子树,参数2:子树深度,参数3:子树直径
{
if (!root) //空树
{
depth = 0;
return; //返回
}
int ldepth = 0, rdepth = 0;
helper(root -> left, ldepth, maxDiameter); //计算左子树深度
helper(root -> right, rdepth, maxDiameter); //计算右子树深度
depth = max(ldepth, rdepth) + 1; //得到子树深度
maxDiameter = max(maxDiameter, ldepth + rdepth + 1); //得到子树最大直径 左右子树深度和 + 根结点深度1
}
int diameterOfBinaryTree(TreeNode* root) {
int distance = 0;
maxDepth (root, distance);
return distance;
}
int maxDepth(TreeNode* root, int& distance)
{
if (!root)
return 0;
int ldepth = maxDepth (root -> left, distance);
int rdepth = maxDepth (root -> right, distance);
cout << root -> val << '\t' << ldepth << '\t' << rdepth << endl;
distance = max (ldepth + rdepth, distance);
return max(ldepth, rdepth) + 1;
}