LeetCodeの平衡二分木(110)、反転二分木(226)

1.平衡二分木(110)

タイトル説明:

【シンプル】

二分木が与えられた場合、それが高度にバランスの取れた二分木であるかどうかを判断します。

この質問では、バランスの取れた二分木は次のように定義されます。

二分木の各ノードの左右のサブツリー間の高さの差の絶対値は1を超えません。

例1:

ここに画像の説明を挿入します

输入:root = [3,9,20,null,null,15,7]
输出:true

トピックリンク

思考分析:

これはツリーの高さ見つける拡張バージョンです。左右のサブツリー間の高さの差が1を超えるかどうかだけが必要です。これで、それだけです。

問題解決策1:トップダウン再帰

1.まず、二分木のノードpの高さを計算する高さ関数を定義する必要があります。
ここに画像の説明を挿入します

2.事前順序でツリーをトラバースできます。現在トラバースされているノードについて、最初に左右のサブツリーの高さを計算します。左右のサブツリー間の高さの差が1を超えない場合は、左右の子を再帰的にトラバースします。ノードと左の子を判断します。ツリーと右のサブツリーのバランスが取れているかどうか。これはトップダウンの再帰的プロセスです。

# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        if not root:
            return True
        return abs(self.height(root.left)-self.height(root.right))<=1 and self.isBalanced(root.left) and self.isBalanced(root.right)
    def height(self,root:TreeNode)->int:
        if not root:
            return 0
        return max(self.height(root.left),self.height(root.right))+1
  • 時間計算量:O(n 2)O(n ^ 2)O n2
  • スペースの複雑さ:O(n)O(n)O n

問題解決策2:ボトムアップ再帰

1.問題の最初の解決策は常に各ノードの高さを繰り返し計算するため、各ノードの左右のサブツリーが下から上にバランスが取れているかどうかを判断できます。

2.ボトムアップ再帰は、ポストオーダートラバーサルに似ています。現在トラバースされているノードの場合、最初に左右のサブツリーのバランスが取れているかどうかを再帰的に判断し、次に現在のノードをルートとするサブツリーのバランスが取れているかどうかを判断します。サブツリーのバランスが取れている場合は、その高さを返します(高さは負でない整数である必要があります)。それ以外の場合は、-1を返します。不均衡なサブツリーがある場合、バイナリツリー全体が不均衡である必要があります。

3.トップダウン再帰と比較して、この方法では、ノードごとに1回だけ高さが検出されます。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        def height(root: TreeNode) -> int:
            if not root:
                return 0
            leftHeight = height(root.left)
            rightHeight = height(root.right)
            if leftHeight == -1 or rightHeight == -1 or abs(leftHeight - rightHeight) > 1:
                return -1
            else:
                return max(leftHeight, rightHeight) + 1

        return height(root) >= 0
  • 時間計算量:O(n)O(n)O n
  • スペースの複雑さ:O(n)O(n)O n

2.二分木を反転します(226)

タイトル説明:

[シンプル]
二分木を反転します。

例:

入る:

     4
   /   \
  2     7
 / \   / \
1   3 6   9

出力:

     4
   /   \
  7     2
 / \   / \
9   6 3   1

トピックリンク

思考分析:

1.二分木を反転するには、左右のサブツリーを再帰的に反転してから、左右のサブツリーを入れ替えます。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def invertTree(self, root: TreeNode) -> TreeNode:
        if not root:
            return root
        left=self.invertTree(root.left)
        right=self.invertTree(root.right)
        root.left,root.right=right,left
        return root
  • 時間計算量:O(n)O(n)O n
  • スペースの複雑さ:O(n)O(n)O n

おすすめ

転載: blog.csdn.net/weixin_45666566/article/details/113241706