leetcode 563. Binary Tree Tilt
Given the root
of a binary tree, return the sum of every tree node's tilt.
The tilt of a tree node is the absolute difference between the sum of all left subtree node values and all right subtree node values. If a node does not have a left child, then the sum of the left subtree node values is treated as 0
. The rule is similar if there the node does not have a right child.
Example 1:
Input: root = [1,2,3] Output: 1 Explanation: Tilt of node 2 : |0-0| = 0 (no children) Tilt of node 3 : |0-0| = 0 (no children) Tile of node 1 : |2-3| = 1 (left subtree is just left child, so sum is 2; right subtree is just right child, so sum is 3) Sum of every tilt : 0 + 0 + 1 = 1
Example 2:
Input: root = [4,2,9,3,5,null,7] Output: 15 Explanation: Tilt of node 3 : |0-0| = 0 (no children) Tilt of node 5 : |0-0| = 0 (no children) Tilt of node 7 : |0-0| = 0 (no children) Tilt of node 2 : |3-5| = 2 (left subtree is just left child, so sum is 3; right subtree is just right child, so sum is 5) Tilt of node 9 : |0-7| = 7 (no left child, so sum is 0; right subtree is just right child, so sum is 7) Tilt of node 4 : |(3+5+2)-(9+7)| = |10-16| = 6 (left subtree values are 3, 5, and 2, which sums to 10; right subtree values are 9 and 7, which sums to 16) Sum of every tilt : 0 + 0 + 0 + 2 + 7 + 6 = 15
Example 3:
Input: root = [21,7,14,1,1,2,2,3,3] Output: 9
Constraints:
- The number of nodes in the tree is in the range
[0, 104]
. -1000 <= Node.val <= 1000
题目难度:简单题
思路:我们需要返回所有node的tilt,想法就是遍历到某个node时,计算出其tilt,并把它累加到一个变量中,最后返回。计算某个node的tilt时,需要左子树的各个node值之和,以及右子树的各个node值之和,因此新建一个函数,返回值为树的node值之和。进一步理解见代码:
C++代码:
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode() : val(0), left(nullptr), right(nullptr) {} 8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} 10 * }; 11 */ 12 class Solution { 13 private: 14 int findTilt(TreeNode *root, int &sum) { 15 //root为传入树的根节点,sum表示以root为跟节点的所有节点tilt值之和 16 if (root == nullptr) { //如果root为空,返回值为0 17 return 0; 18 } 19 int left = findTilt(root->left, sum); 20 int right = findTilt(root->right, sum); 21 sum += abs(left - right); 22 return left + right + root->val; 23 } 24 public: 25 int findTilt(TreeNode* root) { 26 int sum = 0; 27 findTilt(root, sum); 28 return sum; 29 } 30 };
时间复杂度:$O(n)$,空间复杂度:$O(n)$
python3代码:
1 # Definition for a binary tree node. 2 # class TreeNode: 3 # def __init__(self, val=0, left=None, right=None): 4 # self.val = val 5 # self.left = left 6 # self.right = right 7 class Solution: 8 def findTilt(self, root: TreeNode) -> int: 9 tTilt = 0 10 11 def valueSum(node): 12 nonlocal tTilt 13 if not node: 14 return 0 15 16 left = valueSum(node.left) 17 right = valueSum(node.right) 18 tTilt += abs(left - right) 19 20 return left + right + node.val 21 22 valueSum(root) 23 24 return tTilt
越努力,越幸运