题目:计算各节点左右子树的差值的绝对值之和。
例如:
节点1:|2- (3+4)| = 5
节点2:0
节点3:|4 - 0| = 4
节点4:0
所以Tilt等于9
然后搬出羞耻的解题方案。。我直接对每个节点遍历一遍然后对其左右子树计算总和差值。。代码如下:
class Solution {
public:
int findTilt(TreeNode* root) {
if(!root)
return 0;
stack<TreeNode*> s;
s.push(root);
while(!s.empty())
{
TreeNode* node = s.top();
filt += compute(node);
s.pop();
if(node->left)
s.push(node->left);
if(node->right)
s.push(node->right);
}
return filt;
}
int compute(TreeNode* root)
{
if(!root)
return 0;
int left_sum = 0, right_sum = 0;
queue<TreeNode*> lefq, rigq;
if(root->left)
lefq.push(root->left);
while(!lefq.empty())
{
TreeNode* lnode = lefq.front();
lefq.pop();
left_sum += lnode->val;
if(lnode->left)
lefq.push(lnode->left);
if(lnode->right)
lefq.push(lnode->right);
}
if(root->right)
rigq.push(root->right);
while(!rigq.empty())
{
TreeNode* rnode = rigq.front();
rigq.pop();
right_sum += rnode->val;
if(rnode->left)
rigq.push(rnode->left);
if(rnode->right)
rigq.push(rnode->right);
}
return abs(left_sum - right_sum);
}
private:
int filt = 0;
};
然后观摩大神,居然可以用postorder traversal(后序遍历),原因是可以先把孩子们遍历一遍。
主要的函数:
int postorder(TreeNode* root)
{
if(!root)
return 0;
int left = postorder(root-left);
int right = postorder(root>right);
res += abs(left - right);
return left + right + root->val;//此处的返回只对于孩子节点有效,把孩子节点所有数值累加
}