两道题都与二叉树中的路径有关,二叉树中的路径即树中两个点之间的连线,可能经过根节点,也可能不经过。可以这么理解路径:树中某一结点,该节点处于某条路径中,路径的其余部分可能在其左右子树中或其父节点中。
两道题都需要设置函数外的变量记录当前最大值。都可以用dfs来解决。
543题中求最长路径,需要找到两个点,这两个点之间的路径长度最大,注意路径长度是这两个点之间点数(包括头尾)-1。
dfs中:先求左右孩子到叶节点的长度,可知返回值应该是左右较大值+1,判断则是1+左+右
/**
* 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 {
private:
int ans;
//求深度
int getDepth(TreeNode* node) {
if(node == NULL) return 0;
int left = getDepth(node->left); //左孩子的深度
int right = getDepth(node->right); //右孩子的深度
ans = max(ans, left + right + 1); //更新
return max(left, right) + 1;
}
public:
int diameterOfBinaryTree(TreeNode* root) {
ans = 1;
getDepth(root);
return ans - 1; //路径数比节点数少一
}
};
124题中则需不断比较 当前最大值 与 当前路径和 的大小。
dfs中:先求左右孩子(若负值则抛弃,取0),返回当前值+左右较大值,判断是当前节点值+左+右
/**
* 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 sum = INT_MIN;
int dfs(TreeNode* node) {
if(node == NULL)
return 0;
//左右分支中的路径和,如果是负数则抛弃
int leftVal = max( 0, dfs(node->left) );
int rightVal = max( 0, dfs(node->right) );
//情况一:不涉及联络点的父节点,该情况不继续向下递归了
int sum1 = node->val + leftVal + rightVal;
sum = max(sum, sum1);
//情况二:涉及到联络点的父节点,即联络点+左分支 或 联络点+右分支
int sum2 = node->val + max( leftVal, rightVal );
return sum2; //递归返回值
}
int maxPathSum(TreeNode* root) {
dfs(root);
return sum;
}
};