leetcode 563. Binary Tree Tilt
Given a binary tree, return the tilt of the whole tree.
The tilt of a tree node is defined as the absolute difference between the sum of all left subtree node values and the sum of all right subtree node values. Null node has tilt 0.
The tilt of the whole tree is defined as the sum of all nodes' tilt.
Example:
Input: 1 / \ 2 3 Output: 1 Explanation: Tilt of node 2 : 0 Tilt of node 3 : 0 Tilt of node 1 : |2-3| = 1 Tilt of binary tree : 0 + 0 + 1 = 1
Note:
- The sum of node values in any subtree won't exceed the range of 32-bit integer.
- All the tilt values won't exceed the range of 32-bit integer.
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int findTilt(struct TreeNode* root) {
int leftTilt=0,rightTilt=0,leftval=0,rightval=0;
if(root==NULL)
{
return 0;
}
if(root->left!=NULL)
{
leftTilt=findTilt(root->left);
leftval=root->left->val;
}
if(root->right!=NULL)
{
rightTilt=findTilt(root->right);
rightval=root->right->val;
}
return leftTilt+rightTilt+abs(leftval-rightval);
}
WA:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int result=0;
int findTilt(struct TreeNode* root) {
int leftTilt=0,rightTilt=0,leftval=0,rightval=0;
if(root==NULL)
{
return 0;
}
if(root->left!=NULL)
{
leftval=findTilt(root->left);
}
if(root->right!=NULL)
{
rightval=findTilt(root->right);
}
result+=abs(leftval-rightval);
return root->val+leftval+rightval;
}
AC:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int findTilt(struct TreeNode* root) {
int leftTilt=0,rightTilt=0,leftval=0,rightval=0;
if(root==NULL)
{
return 0;
}
if(root->left!=NULL)
{
leftTilt=findTilt(root->left);
leftval=root->left->val;
}
if(root->right!=NULL)
{
rightTilt=findTilt(root->right);
rightval=root->right->val;
}
root->val+=leftval+rightval;
return leftTilt+rightTilt+abs(leftval-rightval);
}
tip:leftval应该是左子树所有节点的和,不应该只是左节点的值。 第二次尝试,返回值错了,最后一次应该返回变量result,所以不行。然后思维回到第一种方法,就是在第一种方法上进行改进,修改树节点的val值,在递归过程中,每个节点的val都改成了改结点左右孩子的val+自己的val,所以,leftval变为了左右子树的val和。
虽然次方法AC了,但是毕竟修改的了树的原本值,所以本方法还是有不足之处。还原树原来的值的话,需要再递归一遍,根减去左右结点,即得本结点值,就可以还原。