LeetCode-Python-156. ツリーを上下に反転

2001 ワード

すべての右ノードが兄弟ノード(同じ親ノードを持つ左ノード)を持つリーフノードであるか、空であるかのいずれかのツリーを上下に反転してツリーになり、元の右ノードが左リーフノードに変換されます.新しいルートを返します.
例:
入力:[1,2,3,4,5]
    1    /\  2   3  /\4   5
出力:ツリーのルート[4,5,2,#,#,3,1]を返します.
4/5 2/3 1説明:
[4,5,2,#,#,3,1]に戸惑う?次に、ツリーがどのようにシーケンス化されているかを詳しく説明します.
ツリーのシーケンス化は階層遍歴規則に従い、ノードが存在しない場合、'#'はパス終端を表す.
次の例があります.
1/2 3/45の上の二叉木は[1,2,3,#,#,4,#,#,5]にシーケンス化する.
ソース:力ボタン(LeetCode)リンク:https://leetcode-cn.com/problems/binary-tree-upside-down著作権はインターネットの所有に帰属する.商業転載は公式の授権に連絡してください.非商業転載は出典を明記してください.
第一の考え方:
再帰的にrootにとってrootはrootとなるべきである.右の子だそれはrootになるべきだleftの左の子.
最後に戻ったのはrootです.left処理後の戻り値.
class Solution(object):
    def upsideDownBinaryTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        #                       
        if not root or (not root.left and not root.right):
            return root

        newroot = self.upsideDownBinaryTree(root.left)
        # self.upsideDownBinaryTree(root.right)                      
        
        root.left.left = root.right
        root.left.right = root
        root.left = None
        root.right = None

        return newroot

2つ目の考え方:
反復.
任意のnodeについて,親ノードと兄弟ノードを知っていると仮定すると,
まずnode.left, node.rightバックアップして、
そしてnode.兄弟ノードだrightは親ノードです.
次のループ処理でバックアップした元のnode.left.
class Solution(object):
    def upsideDownBinaryTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        #                       
        if not root or (not root.left and not root.right):
            return root

        parent, sibling = None, None
        while root:
            tmp = root.left
            root.left = sibling
            
            sibling = root.right
            root.right = parent
            
            parent = root
            root = tmp
            
        return parent