Leetcode 563 二叉樹的坡度

2021-10-02 22:14:05 字數 1413 閱讀 2804

給定乙個二叉樹,計算整個樹的坡度。

乙個樹的節點的坡度定義即為,該節點左子樹的結點之和和右子樹結點之和的差的絕對值。空結點的的坡度是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...