LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
主要学习内容:
二叉树深度求法
深度的 left+right+1 得到的是从根结点到叶子结点的节点数量
543.二叉树的直径
[543. 二叉树的直径 - 力扣(LeetCode)](https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/)
解法思路:
说之前先来看一种经典的错误。。
c++
class Solution {
public:
int maxDepth=-1;
int tra(TreeNode *t)
{
if(t==nullptr)
return 0;
return 1+max(tra(t->left),tra(t->right));
}
int diameterOfBinaryTree(TreeNode* root) {
if(root==nullptr)
return 0;
return tra(root->left)+tra(root->right);
}
};
哈哈想的是,左右子树最大深度求出来一加,直接完事了,可惜的是这种是错误的
这个是错误示例,很明显,最长的直径在右子树上,而不是左子树加右子树的深度。
不过这也启发我们,说明思路是对的,只是应该有一个记录最大值的变量,然后对每一个节点都进行一遍这个操作,把最大的记录下来就是了
那接下来就是二叉树求深度
1.函数参数和返回值
c++
int maxDepth=-1;
int tra(TreeNode *t)
maxDepth记录最大直径,就是答案
返回值返回以当前结点为根结点的子树的深度
2.终止条件
直到没有数即没有结点要构建就是结束
c++
if(t==nullptr)
return 0;
碰到空了不加深度,直接返回0就行
3.本层代码逻辑
c++
int left=tra(t->left);
int right=tra(t->right);
maxDepth=max(maxDepth,left+right+1);
return 1+max(left,right);
left记录左子树深度
right记录右子树深度
更新以当前结点为子树的深度(l+r+1)和maxDepth之间的大小,最大值赋值给maxDepth
更新后,返回上层递归函数当前子树的最大深度
完整代码:
c++
class Solution {
public:
int maxDepth=-1;
int tra(TreeNode *t)
{
if(t==nullptr)
return 0;
int left=tra(t->left);
int right=tra(t->right);
maxDepth=max(maxDepth,left+right+1);
return 1+max(left,right);
}
int diameterOfBinaryTree(TreeNode* root) {
if(root==nullptr)
return 0;
int t=tra(root);
return maxDepth-1;
}
};
最后注意:我们求的直径是边数,(l+r+1求的是节点数),要减去1才是边数。