2246. Longest Path With Different Adjacent Characters差不多的道理,只是這題只有兩個子節點。

題目

輸入一棵二元樹,求此樹的直徑。
二元樹的直徑是樹中任意兩個節點之間最長路徑的長度,且此路徑可能不會通過根。兩個節點之間的長度為他們之間的數。

解法

直徑長度=邊數量=路徑節點數量-1。
先求出最長直徑最多有幾個節點ans,再把ans-1就是答案。

dfs(i)函數求的是以節點i出發,可以構成的最大路徑長度。
試著以i為中心點,從左子樹通過i後前往右子樹,檢查是否能更新直徑。最後選擇左右子路徑中較大者,加上節點i組成新的子路徑。

class Solution:
    def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:
        ans=0
        
        def dfs(node):
            nonlocal ans
            if not node:
                return 0
            l=dfs(node.left)
            r=dfs(node.right)
            ans=max(ans,l+r+1) # left+node=right
            return max(l,r)+1
        
        dfs(root)
        
        return ans-1