LeetCode-Python-156. ツリーを上下に反転
すべての右ノードが兄弟ノード(同じ親ノードを持つ左ノード)を持つリーフノードであるか、空であるかのいずれかのツリーを上下に反転してツリーになり、元の右ノードが左リーフノードに変換されます.新しいルートを返します.
例:
入力:[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処理後の戻り値.
2つ目の考え方:
反復.
任意のnodeについて,親ノードと兄弟ノードを知っていると仮定すると,
まずnode.left, node.rightバックアップして、
そしてnode.兄弟ノードだrightは親ノードです.
次のループ処理でバックアップした元のnode.left.
例:
入力:[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