[LeetCode]563. Binary Tree Tilt解法及python代码
2018-02-02 14:38
351 查看
原题链接:https://leetcode.com/problems/binary-tree-tilt/
先来了解一下Tilt的描述,原题的描述是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.
翻译过来就是一个树节点的Tilt是该节点左子树的总和与右子树的总和的绝对差值。空节点上午Tilt是0。我的理解就是一个节点左右子树值得差异。树的题大部分都可以用递归的方法来解。递归的访问左右子树,然后返回节点值的总和用来计算每个节点的Tilt。最开始的想法是为了使解题过程清晰,就用一个list将所有计算出来的Tilt都记录下来,最后再计算和返回(其实是可以在递归的过程中直接算出最后结果的)。下面代码:
上面这种方法会慢一些,但是整个的过程会很清晰,方便理解。
下面这种方法就是在递归的过程中返回一个二元组,(sum,TiltSum),递归的出口是在访问到空节点时返回(0,0)二元组。这种写法相对的快一些(我认为时间复杂度都是O(n),但实际的执行时间会差一些,代码也相对简洁)。下面是代码:
先来了解一下Tilt的描述,原题的描述是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.
翻译过来就是一个树节点的Tilt是该节点左子树的总和与右子树的总和的绝对差值。空节点上午Tilt是0。我的理解就是一个节点左右子树值得差异。树的题大部分都可以用递归的方法来解。递归的访问左右子树,然后返回节点值的总和用来计算每个节点的Tilt。最开始的想法是为了使解题过程清晰,就用一个list将所有计算出来的Tilt都记录下来,最后再计算和返回(其实是可以在递归的过程中直接算出最后结果的)。下面代码:
class Solution(object): def findTilt(self, root): """ :type root: TreeNode :rtype: int """ Tilt = [] def helper(node): if not node.left and not node.right: Tilt.append(0) return node.val if not node.left and node.right: temp0 = helper(node.right) Tilt.append(abs(temp0)) return node.val + temp0 if node.left and not node.right: temp1 = helper(node.left) Tilt.append(abs(temp1)) return node.val + temp1 if node.left and node.right: temp2 = helper(node.left) temp3 = helper(node.right) Tilt.append(abs(temp2-temp3)) return node.val + temp2 + temp3 sum = 0 if not root: return sum helper(root) print Tilt for key in Tilt: sum += key return sum
上面这种方法会慢一些,但是整个的过程会很清晰,方便理解。
下面这种方法就是在递归的过程中返回一个二元组,(sum,TiltSum),递归的出口是在访问到空节点时返回(0,0)二元组。这种写法相对的快一些(我认为时间复杂度都是O(n),但实际的执行时间会差一些,代码也相对简洁)。下面是代码:
class Solution1(object): def findTilt(self, root): """ :type root: TreeNode :rtype: int """ #return (sum,TiltSum) def helper(node): if not node: return (0,0) left = helper(node.left) right = helper(node.right) return (node.val + left[0] + right[0],abs(left[0] - right[0]) + left[1] + right[1]) return helper(root)[1]
相关文章推荐
- [LeetCode]12. Integer to Roman解法及python代码
- [LeetCode]34. Search for a Range解法及python代码
- [LeetCode]669. Trim a Binary Search Tree解法及python代码
- LeetCode - Two Sum 完整代码(python)
- python得到所有在leetcode上Accepted的代码(一)
- 【LeetCode】【Python】【C++】7. Reverse Integer代码实现
- [LeetCode]Maximum Depth of Binary Tree(递归和层序遍历解法)@python
- LeetCode 322. Coin Change Python 动态规划/BFS解法
- 【原创】用Python爬取LeetCode的AC代码到Github
- LeetCode 64 Minimum Path Sum(Python详解及代码实现)
- LeetCode 22. Generate Parentheses 生成括号 Python 回溯解法
- LeetCode Single Number III (Java和Python代码)
- [LeetCode]11. Container With Most Water解法及python
- 隐马尔科夫模型,第三种问题解法,维比特算法(biterbi) algorithm python代码
- Leetcode 78. Subsets Python DFS 深度优先搜索解法
- leetcode -- Multiply Strings -- python容易处理,需要看其他解法
- LeetCode:1. Two Sum解法(C,C++,Jave,Python)
- LeetCode 139. Word Break 动态规划DP Python解法
- 【LeetCode】【Python】【C++】2. Add Two Numbers代码实现
- (Python)LeetCode 习题代码(部分)