int findTilt(TreeNode* root) {
int res=0;
helper(root,res);
return res;
}
void helper(TreeNode* node,int &res){
if(!node) return ;
helper(node->left,res);
helper(node->right,res);
int left=getSubSum(node->left);
int right=getSubSum(node->right);
res+=abs(left-right);
return ;
}
int getSubSum(TreeNode* node){
int res=0;
stack<TreeNode*> s;
while(node||!s.empty()){
while(node){
s.push(node);
node=node->left;
}
node=s.top();
s.pop();
res+=node->val;
node=node->right;
}
return res;
}
采用先序遍历的方式
public:
int findTilt(TreeNode* root) {
if(!root) return 0;
int tilt=abs(getSum(root->left)-getSum(root->right));
return tilt+findTilt(root->left)+findTilt(root->right);
}
int getSum(TreeNode* node){
if(!node) return 0;
if(m.count(node)) return m[node];
int res=node->val+getSum(node->left)+getSum(node->right);
return m[node]=res;
}
private:
unordered_map<TreeNode*,int>m;
使用后序遍历
知道左右子树的和之后可由此得出此树的tilt。
int findTilt(TreeNode* root) {
int res=0;
postOrderSum(root,res);
return res;
}
int postOrderSum(TreeNode* node,int&res){
if(!node) return 0;
int left=postOrderSum(node->left,res);
int right=postOrderSum(node->right,res);
res+=abs(left-right);
return left+right+node->val;
}