Easy-24

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:

  1. The sum of node values in any subtree won't exceed the range of 32-bit integer.
  2. All the tilt values won't exceed the range of 32-bit integer.

WA :

/**
 * 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了,但是毕竟修改的了树的原本值,所以本方法还是有不足之处。还原树原来的值的话,需要再递归一遍,根减去左右结点,即得本结点值,就可以还原。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值