我的想法
从根节点开始,求出每个几点的度,然后累加。代码如下:
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def node_Tilt(root):# 每个节点的坡度
if not root:
return 0
if not (root.left or root.right):# 是叶子节点
return 0
else:
return abs(sum_of_sub_tree(root.left) - sum_of_sub_tree(root.right))
def sum_of_sub_tree(root):
'''
求当前子树为根节点的和
:param root:
:return:
'''
if not root:
return 0
stack = []
sum_node = 0#
last_visit = root
while stack or root:
while root:
# print(root.val)# 先序
sum_node += root.val
stack.append(root)
root = root.left
root = stack.pop()
if root.right:
# print(root.val)# 中序
root = root.right
else:
root = None
return sum_node
class Solution:
def findTilt(self, root: TreeNode) -> int:
if not root:
return 0
# a = node_Tilt(root)
# print('***', root.val, a)
# l = self.findTilt(root.left)
# r = self.findTilt(root.right)
# return a + l + r
return node_Tilt(root)+self.findTilt(root.left)+self.findTilt(root.right)
有个问题:
是从根节点向下遍历的,根节点一下的节点遍历了多次。造成了时间的浪费。
参考:基于后续遍历的思想求解二叉树的坡度
每次遍历一个节点,返回它的子树和及度的和。
class Solution:
def findTilt(self, root: TreeNode) -> int:
def search(root: TreeNode) -> (int, int): # 返回节点和,累积坡度
if not root:
return 0, 0
else:
sl, pl = search(root.left) # 递归求解子问题
sr, pr =search(root.right) # 递归求解子问题
return sr + sl + root.val, abs(sl - sr) + pl + pr # 跟节点的节点和,累积坡度与子问题的递归关系(合并子问题,形成原问题的解)
_, p = search(root)
return p
作者:lzx1997
链接:https://leetcode-cn.com/problems/binary-tree-tilt/solution/ji-yu-hou-xu-bian-li-de-si-xiang-qiu-jie-d982/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

该博客介绍了如何通过后序遍历优化二叉树的坡度计算,避免节点被重复访问,从而提高算法效率。作者提出了一个新的解决方案,利用递归搜索每个节点的子树和及度的和,有效地合并子问题并减少时间浪费。

514





