• Leetcode.树形DP


    目录

    543.二叉树的直径

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

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


    543.二叉树的直径

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

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
    8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10. * };
    11. */
    12. class Solution {
    13. public:
    14. int ans = 0;
    15. int dfs(TreeNode*root){
    16. if(!root)return -1;
    17. int left = dfs(root->left)+1;
    18. int right = dfs(root->right)+1;
    19. ans = max(left+right,ans);
    20. return max(left,right);
    21. }
    22. int diameterOfBinaryTree(TreeNode* root) {
    23. dfs(root);
    24. return ans;
    25. }
    26. };

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

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

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
    8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10. * };
    11. */
    12. class Solution {
    13. public:
    14. int ans = -0x3f3f3f3f;
    15. int dfs(TreeNode*root){
    16. if(!root)return 0;
    17. int left = dfs(root->left);
    18. int right = dfs(root->right);
    19. ans = max(left+right+root->val,ans);
    20. return max(max(left,right)+root->val,0);
    21. }
    22. int maxPathSum(TreeNode* root) {
    23. dfs(root);
    24. return ans;
    25. }
    26. };

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

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

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

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

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

    1. const int N = 2e5+10;
    2. class Solution {
    3. public:
    4. int e[N],ne[N],h[N],idx;
    5. int n;
    6. int ans;
    7. string tem;
    8. void add(int a,int b){
    9. e[idx] = b,ne[idx] = h[a],h[a] = idx++;
    10. }
    11. int dfs(int u,int father){
    12. int x_len = 0;
    13. for(int i=h[u];~i;i=ne[i]){
    14. int j = e[i];
    15. if(j==father)continue;
    16. int y_len = dfs(j,u)+1;
    17. if(tem[j]!=tem[u]){
    18. ans = max(x_len+y_len,ans);
    19. x_len = max(x_len,y_len);
    20. }
    21. }
    22. // cout<
    23. return x_len;
    24. }
    25. int longestPath(vector<int>& parent, string s) {
    26. memset(h,-1,sizeof h);
    27. tem = s;
    28. ans = idx = 0;
    29. int n = s.size();
    30. for(int i=1;i
    31. add(i,parent[i]),add(parent[i],i);
    32. }
    33. dfs(0,-1);
    34. return ans+1;
    35. }
    36. };

  • 相关阅读:
    第一章初识Maven与Maven安装配置——尚硅谷
    自动化之Java面试
    Windows系统中搭建docker (ubuntu,Docker-desktop)
    细胞膜仿生修饰树枝状聚酰胺-胺PAMAM/细胞膜修饰超声造影剂/介孔硅
    C语言经典100例题(51-54)--学习使用按位与& ,按位或 |,按位异或 ^和按位取反~
    while循环语句
    python毕业设计作品基于django框架新闻信息管理系统毕设成品(3)后台管理功能
    Java当中的BIO模型
    Can‘t connect to MySQL server on ‘localhost3306‘ (10061) 简洁明了的解决方法
    电脑硬件——主板
  • 原文地址:https://blog.csdn.net/m0_60921016/article/details/134081821