leetcode687——Longest Univalue Path

    技术2022-07-13  66

    题目大意:求二叉树中每个节点值都相同的最长路径长度,长度=节点间边数。

    分析:dfs。维护全局maxLen,对每个节点求最长路径。经过该节点的最长路径=leftLen+rightLen。LeftGain、RightGain分别为左右子节点的最大贡献值。节点最大贡献值=节点值+max(leftGain,rightGain),因为贡献值代表该节点左侧路径or右侧路径二选一,选择一条贡献值最大的继续往该节点的父节点贡献。

    代码:

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { int maxLen = 0; public: int longestUnivaluePath(TreeNode* root) { dfs(root); return maxLen; } int dfs(TreeNode* root) { if(!root) return 0; int leftLen = dfs(root->left); //求左节点的最长贡献值 int rightLen = dfs(root->right); //求右节点的最长贡献值 int rootLeft = 0,rootRight = 0; //维护root开始的左右分支的最长同值路径长度 if(root->left && root->left->val == root->val) rootLeft += leftLen + 1;; if(root->right && root->right->val == root->val) rootRight += rightLen + 1; maxLen = max(rootLeft + rootRight,maxLen); //更新经过root的最长同值路径 return max(rootLeft,rootRight); //返回节点最长贡献值 } };

     

    Processed: 0.009, SQL: 9