周賽311。其實這也是秒殺題,只是我在雙指針反轉的時候不小心打錯字,想說怎麼輸出錯誤,浪費10分鐘才找到原因。

題目

輸入一棵prefect二元樹的根節點,反轉樹中每個奇數層的節點值。
例如第3層的節點值為[2,1,3,4,7,11,29,18],則應反轉為[18,29,11,7,4,3,1,2]。
回傳反轉過後的樹根節點。

解法

prefect二元樹整個節點塞滿滿,非常友好,而且反轉是整層倒過來,沒有任何意外。
先進行一次dfs把所有節點依照深度分類,之後對所有奇數層使用雙指針將數值反轉。

時空間複雜度皆為O(N)。

class Solution:
    def reverseOddLevels(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        d=defaultdict(list)
        
        def dfs(node,lvl):
            if not node:
                return 
            d[lvl].append(node)
            dfs(node.left,lvl+1)
            dfs(node.right,lvl+1)
            
        dfs(root,0)
        
        for lvl,nodes in d.items():
            if lvl&1:
                lo=0
                hi=len(nodes)-1
                while lo<hi:
                    nodes[lo].val,nodes[hi].val=nodes[hi].val,nodes[lo].val
                    lo+=1
                    hi-=1
        
        return root

BFS版本,和上面版本大同小異。

class Solution:
    def reverseOddLevels(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        d=defaultdict(list)
        
        q=deque()
        q.append([root,0])
        while q:
            node,lvl=q.popleft()
            if not node:
                continue
            d[lvl].append(node)
            q.append([node.left,lvl+1])
            q.append([node.right,lvl+1])
                  
        for k in d:
            if k%2==1:
                nodes=d[k]
                l=0
                r=len(nodes)-1
                while l<r:
                    t=nodes[l].val
                    nodes[l].val=nodes[r].val
                    nodes[r].val=t
                    l+=1
                    r-=1

        return root