Leetcode.树形DP

目录

543.二叉树的直径

124.二叉树中的最大路径和

2246.相邻字符不同的最长路径


543.二叉树的直径

用递归来写 考虑 树形DP 维护以当前节点为根节点的最大值,同时返回给父节点经过当前节点的最大链的长度,这有个trick 当遍历到空节点的时候返回-1 递归进的时候加一个1就好了具体看代码

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int ans = 0;
    int dfs(TreeNode*root){
        if(!root)return -1;
        int left = dfs(root->left)+1;
        int right = dfs(root->right)+1;

        ans = max(left+right,ans);

        return max(left,right);
    }
    int diameterOfBinaryTree(TreeNode* root) {
        dfs(root);
        return ans;
    }
};

124.二叉树中的最大路径和

这个题要我们返回最大路径和,还是考虑递归

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int ans = -0x3f3f3f3f;
    int dfs(TreeNode*root){
        if(!root)return 0;
        int left = dfs(root->left);
        int right = dfs(root->right);

        ans = max(left+right+root->val,ans);
        return max(max(left,right)+root->val,0);
    }
    int maxPathSum(TreeNode* root) {
        dfs(root);
        return ans;
    }
};

2246.相邻字符不同的最长路径

有了前面题目的铺垫,其实还是维护以某点为根节点的最大距离,这里还是用了一个trick,每算一次就取一次最值然后维护最大值,具体可以看这个图来理解

(图片引用自灵茶山艾府)

算到3的时候最大值为3 算到2的时候最大值为3+2 并且此时以x为根节点的子树的最长路径为3,遍历到4的时候最大值为3+4 并且更新x为根节点的子树的最长路径为4

然后保证相邻的字符不一样的话加一个判断就好了

cpp 复制代码
const int N = 2e5+10;
class Solution {
public:
    int e[N],ne[N],h[N],idx;
    int n;
    int ans;
    string tem;
    void add(int a,int b){
        e[idx] = b,ne[idx] = h[a],h[a] = idx++;
    }
    int dfs(int u,int father){
        int x_len = 0;
        for(int i=h[u];~i;i=ne[i]){
            int j = e[i];
            if(j==father)continue;
            int y_len = dfs(j,u)+1;

            if(tem[j]!=tem[u]){
                ans = max(x_len+y_len,ans);
                x_len = max(x_len,y_len);
            }
               
        }

       // cout<<u<<" "<<x_len<<"\n";
        return x_len;
    }
    int longestPath(vector<int>& parent, string s) {
        memset(h,-1,sizeof h);
        tem = s;
        ans = idx = 0;
        int n = s.size();
        for(int i=1;i<n;i++){
            add(i,parent[i]),add(parent[i],i);
        }
        dfs(0,-1);
        return ans+1;
    }
};
相关推荐
Y1nhl7 分钟前
力扣_链表_python版本
开发语言·python·算法·leetcode·链表·职场和发展
一个 00 后的码农18 分钟前
26考研物理复试面试常见问答问题汇总(2)电磁波高频面试问题,物理专业保研推免夏令营面试问题汇总
考研·面试·职场和发展
qq_4017004122 分钟前
C语言中位运算以及获取低8位和高8位、高低位合并
c语言·开发语言·算法
CoovallyAIHub25 分钟前
YOLO模型优化全攻略:从“准”到“快”,全靠这些招!
深度学习·算法·计算机视觉
闻缺陷则喜何志丹31 分钟前
【BFS】 P10864 [HBCPC2024] Genshin Impact Startup Forbidden II|普及+
c++·算法·宽度优先·洛谷
MicroTech20251 小时前
微算法科技(NASDAQ: MLGO)探索Grover量子搜索算法,利用量子叠加和干涉原理,实现在无序数据库中快速定位目标信息的效果。
数据库·科技·算法
今天背单词了吗9801 小时前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题
手握风云-1 小时前
优选算法的链脉之韵:链表专题
数据结构·算法·链表
Coding小公仔1 小时前
LeetCode 151. 反转字符串中的单词
开发语言·c++·算法
稳兽龙1 小时前
P1098 [NOIP 2007 提高组] 字符串的展开
c++·算法·模拟