0x3f老师-算法题笔记-树形dp(三)

内容

定义:二叉树的直径
![[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;
    }
};

问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值