内容
定义:二叉树的直径
![[2024-06-26_140810.png]]
算深度,顺便算直径
![[2024-06-26_141020.png]]
T543. 二叉树的直径
class Solution {
public:
int diameterOfBinaryTree(TreeNode* root) {
int ans=0;
function<int(TreeNode*)> dfs=[&](TreeNode* node)->int{
if(node==nullptr) return -1;
int left=dfs(node->left)+1;
int right=dfs(node->right)+1;
//在计算深度的同时记录直径
ans=max(left+right,ans);
return max(left,right);
};
dfs(root);
return ans;
}
};
T124.二叉树中的最大路径和
T543. 二叉树的直径的稍微升级一丢丢
class Solution {
public:
int maxPathSum(TreeNode* root) {
//至少包含一个节点的保证
int ans=INT_MIN;
function<int(TreeNode*)> dfs=[&](TreeNode* node)->int{
if(node==nullptr) return 0;
int left=dfs(node->left);
int right=dfs(node->right);
ans=max(ans,left+right+node->val);
//还和0比较一下,防止返回INT_MIN
return max(max(left,right)+node->val,0);
};
dfs(root);
return ans;
}
};
T2246. 相邻字符不同的最长路径(本章重点)
![[2024-06-26_153504.png]]
class Solution {
public:
int longestPath(vector<int>& parent, string s) {
int n = parent.size();
vector<vector<int>> g(n);
for (int i = 1; i < n; ++i) {
g[parent[i]].push_back(i);
}
int ans = 0;
function<int(int)> dfs = [&](int x) -> int {
// 很有逻辑的一段
int maxlen = 0; // 该节点下最长链
for (auto y : g[x]) {
int y_len = dfs(y) + 1;
//不同时,才更新答案
if (s[x] != s[y]) {
ans = max(ans, maxlen + y_len);
// 更新最长链
maxlen = max(maxlen, y_len);
}
}
return maxlen;
};
dfs(0);
//计算的是点,所以比边多一个
return ans + 1;
}
};
1353

被折叠的 条评论
为什么被折叠?



