「思路」
设定两个函数,tilt,sum。tilt负责收集左右的和,并相减,并将所有相减的结果想加。sum负责纵向的相加,算出左右字树数字的和。分类按照有无左右子数分类。
「运行结果」
class Solution {
public:
int findTilt(TreeNode* root) {
if(!root)return 0;
return tilt(root,0,0,0);
}
int tilt(TreeNode* root,int ans,int sumleft,int sumright)
{
if(!root->left && !root->right) {return 0;}
if(root->left && root->right){
sumleft=root->left->val+sum(root->left,sumleft,sumright);
sumright=root->right->val+sum(root->right,sumleft,sumright);
return ans=abs(sumleft-sumright)+tilt(root->left,ans,sumleft,sumright)+tilt(root->right,ans,sumleft,sumright);}
if(!root->left && root->right){
sumleft=0;
sumright=root->right->val+sum(root->right,sumleft,sumright);
return ans=abs(sumleft-sumright)+tilt(root->right,ans,sumleft,sumright);}
if(root->left && !root->right){
sumright=0;
sumleft=root->left->val+sum(root->left,sumleft,sumright);
return ans=abs(sumleft-sumright)+tilt(root->left,ans,sumleft,sumright);}
}
int sum(TreeNode* root,int sumleft,int sumright)
{
if(!root->left && !root->right)
{return 0;}
if(root->left && root->right)
{
sumleft=root->left->val+sum(root->left,sumleft,sumright);
sumright=root->right->val+sum(root->right,sumleft,sumright);
return sumleft+sumright;
}
if(!root->left && root->right)
{
return root->right->val+sum(root->right,sumleft,sumright);
}
if(root->left && !root->right)
{
return root->left->val+sum(root->left,sumleft,sumright);
}
}
};
但是显然代码太过冗杂,做完后查看了leetcode上效率最高的算法,如下:
class Solution {
public:
int result = 0;
int findTilt(TreeNode* root) {
DFS(root);
return result;
}
int DFS(TreeNode* root) {
if ( !root ) { return 0; }
int l_sub = DFS( root->left );
int r_sub = DFS( root->right );
result += abs( l_sub - r_sub );
return l_sub + r_sub + root->val;
}
};
显然简便很多,所以还得要勤加练习!