給定乙個二叉樹,計算整個樹的坡度。
乙個樹的節點的坡度定義即為,該節點左子樹的結點之和和右子樹結點之和的差的絕對值。空結點的的坡度是0。
整個樹的坡度就是其所有節點的坡度之和。
示例:
輸入:
1/ \
2 3
輸出: 1
解釋:
結點的坡度 2 : 0
結點的坡度 3 : 0
結點的坡度 1 : |2-3| = 1
樹的坡度 : 0 + 0 + 1 = 1
注意:
任何子樹的結點的和不會超過32位整數的範圍。
坡度的值不會超過32位整數的範圍。
這道題拿到的時候,我的思路是這樣的:首先遍歷二叉樹,求出各個節點的值,然後將該節點的值儲存到字典裡,key為節點,value就是節點的值;然後,再次遍歷節點,對每個節點的求其坡度,同時加到結果ans中,這個過程中會去取節點的值,那麼之前儲存的字典就用上了。
後來想了一下,之前的第二次遍歷和第一次其實沒有什麼區別,能不能將這兩次遍歷合為一體,把需要做的事情同時做了呢?當然可以。思路如下:
遍歷二叉樹的時候,left儲存左子樹的和,right儲存右子樹的和,那麼,該節點的坡度就是left-right的絕對值,把這個值直接加到最終的結果ans中,然後遞迴返回的是left+right+node.val,這樣就表示,別人遞迴呼叫的時候,返回的是這個節點的左子樹和右子樹以及該節點三者的和,回頭想想left和right,是不是這回事。當然,遞迴的出口是,node==none,返回0
# definition for a binary tree node.
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class
solution
:def
findtilt
(self, root: treenode)
->
int:
ans =[0
]def
inorder
(r):if(
not r)
:return
0 left = inorder(r.left)
right = inorder(r.right)
ans[0]
+=abs
(left - right)
return left + right + r.val
inorder(root)
return ans[
0]
LeetCode 563 二叉樹的坡度
題目鏈結 題目描述 給定乙個二叉樹,計算整個樹的坡度。乙個樹的節點的坡度定義即為,該節點左子樹的結點之和和右子樹結點之和的差的絕對值。空結點的的坡度是0。整個樹的坡度就是其所有節點的坡度之和。示例 輸入 1 2 3輸出 1 解釋 結點的坡度 2 0 結點的坡度 3 0 結點的坡度 1 2 3 1 樹...
Leetcode 563 二叉樹的坡度
給定乙個二叉樹,計算整個樹的坡度。乙個樹的節點的坡度定義即為,該節點左子樹的結點之和和右子樹結點之和的差的絕對值。空結點的的坡度是0。整個樹的坡度就是其所有節點的坡度之和。示例 輸入 1 2 3輸出 1解釋 結點的坡度 2 0 結點的坡度 3 0 結點的坡度 1 2 3 1 樹的坡度 0 0 1 1...
LeetCode 563 二叉樹的坡度
題目 給定乙個二叉樹,計算整個樹的坡度。乙個樹的節點的坡度定義即為,該節點左子樹的結點之和和右子樹結點之和的差的絕對值。空結點的的坡度是0。整個樹的坡度就是其所有節點的坡度之和。示例 輸入 1 2 3 輸出 1 解釋 結點的坡度 2 0 結點的坡度 3 0 結點的坡度 1 2 3 1樹的坡度 0 0...