leetcode 543 二叉树的直径
题目
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
当我遇到了这道题目,我的第一想法就是两个字————"遍历",遍历棵树上的所有节点,遍历完成我们就可以得到答案了,其实leetcode的很多题目都是这种朴实无华的思路,千万别小看了遍历的,遍历是一切思路的基础。
在我们遍历的过程中,我们一直维护一个变量max_diameter。然后遍历完成返回这个数值即可。
好了,现在问题来了,在遍历的过程中,我们应该进行什么样的操作,来对max_diameter变量进行更新呢?
- 我们要求的是直径,直径也就是一条路径。它只可能有一个分叉,或者没有分叉,不可能有两个分叉。
- 当我们遍历到一个节点时候,我们得到这个节点的左右子数的高度之和,利用这个数据对max_diameter的取max进行更新。
我们遍历到的那个节点,也就是路径的分叉处,得到左右指数高度之和的意义是:根据这个节点所能能得到的最长路径
好了,这下思路就理顺了,接下来就是代码实现的环节了
class Solution {
int max_diameter;
public:
int diameterOfBinaryTree(TreeNode* root) {
max_diameter = 0;
dfs(root);
return max_diameter;
}
void dfs(TreeNode* root){
if (root == nullptr)
return;
int left = get_height(root->left);
int right = get_height(root->right);
int diameter = left + right;
max_diameter = max(max_diameter, diameter);
dfs(root->left);
dfs(root->right);
}
int get_height(TreeNode* root){
if (root == nullptr)
return 0;
return max( get_height(root->left), get_height(root->right) ) + 1;
}
};