Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのジグザグラベル付き二分木のパス


すべてのノードに2つの子がある無限の二分木で、ノードに行順にラベルが付けられているとします。奇数行(1、3、5、...)では、ラベル付けは左から右になり、偶数行(2、4、6、...)では、ラベル付けは右から左になります。 。したがって、ツリーは次のようになります-

Pythonのジグザグラベル付き二分木のパス

したがって、このツリーでノードのラベルを付けたので、ツリーのルートからそのラベルの付いたノードまでのパスでラベルを見つける必要があります。したがって、入力がlabel =14の場合、出力は[1,3,4,14]

になります。

これを解決するには、次の手順に従います-

  • 2つの配列ツリーと解像度を定義し、ツリー配列に0と1を挿入し、奇数:=1と現在:=1と2:=2

    を設定します。
  • label =1の場合、単一の要素1を含むリストを返します。

  • 1つの無限ループを作成します-

    • 奇数がゼロ以外の場合、

      • max_val:=現在+2

      • temp:=max_val

      • 一時的>現在

        • ツリーに温度を挿入

        • temp =labelの場合、ループから出てきます

        • 温度を1下げる

      • ツリーの最後の要素がラベルの場合、ループから出てきます

      • 現在:=max_val

    • それ以外の場合

      • temp:=two

      • 温度がゼロではない間

        • temp:=1、電流を1増やしてから、ツリーへの電流を増やします

        • current =labelの場合、ループから出てきます

      • ツリーの最後の要素がラベルの場合、ループから出てきます

    • temp:=temp * 2

    • odd:=oddがゼロ以外の場合はfalse、それ以外の場合はtrue

  • index:=ツリーの長さ– 1

  • インデックスが0ではない場合

    • tree[index]をres配列に挿入

    • インデックス:=インデックス/ 2

  • res:=resの逆リスト

  • 解像度を返す

例(Python)

理解を深めるために、次の実装を見てみましょう-

class Solution(object):
   def pathInZigZagTree(self, label):
      tree = []
      res = []
      tree.append(0)
      tree.append(1)
      odd = 1
      current = 1
      two = 2
      if label == 1:
         return [1]
      while True:
         if odd:
            max_val = current + two
            temp = max_val
            while temp>current:
               tree.append(temp)
               if temp == label:
                  break
               temp-=1
            if tree[-1]== label:
               break
            current = max_val
         else:
            temp = two
            while temp:
               temp-=1
               current+=1
               tree.append(current)
            if current == label:
               break
            if tree[-1]== label:
               break
         two*=2
         odd = not odd
      index = len(tree)-1
      while index:
         res.append(tree[index])
         index//=2
      res=res[::-1]
      return res
ob = Solution()
print(ob.pathInZigZagTree(14))

入力

14

出力

[1,3,4,14]

  1. Pythonで二分木を反転する

    二分木があるとします。私たちの仕事は、逆二分木を作成することです。したがって、ツリーが以下のようになっている場合- 反転したツリーは次のようになります これを解決するために、再帰的アプローチを使用します ルートがnullの場合は、戻ります 左右のポインタを入れ替える 左のサブツリーと右のサブツリーを再帰的に解決します 例(Python) 理解を深めるために、次の実装を見てみましょう- class TreeNode:    def __init__(self, data, left = None, right = None):    

  2. Pythonでの二分木の最大深度

    二分木が1つあるとします。その木の最大の深さを見つけなければなりません。ツリーの最大深度は、最長のパスを使用してルートからリーフに到達するためにトラバースされるノードの最大数です。ツリーが次のようになっているとします。ここでは深さが3になります。 これを解決するために、次の手順に従います。 ここでは、再帰的アプローチを使用します。メソッドはsolve(root、depth =0)です。 ルートが空の場合は、深さを返します それ以外の場合は、solve(left、depth + 1)とsolve(left、depth + 1)の最大値を返します 理解を深めるために、次の実装を見てみ