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

Pythonで二分木の上面図を見つけるプログラム


二分木があるとすると、木の上面図を見つける必要があり、左から右に並べ替えられます。

したがって、入力が画像のような場合、出力は[3、5、8、6、9]になります。これは、3が2より上で、5が7より上であるため、表示されないためです。

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

  • ビュー:=新しい空の地図

  • q:=両端キュー

  • qの最後にペア(ルート、0)を挿入します

  • start:=inf、end:=−inf

  • qが空でない間、実行します

    • (node、coord):=qの左側の要素、次にqの左側の要素を削除

    • start:=開始と調整の最小値

    • end:=endとcoordの最大値

    • 座標が表示されていない場合は、

      • view [coord]:=ノードの値

    • ノードの左側がnullでない場合、

      • qの最後に(ノードの左側、座標-1)を挿入します

    • ノードの権利がnullでない場合、

      • qの最後に(ノードの右側、座標+ 1)を挿入します

  • res:=新しいリスト

  • 範囲内のiの場合、開始から終了まで、実行します

    • 私が表示されている場合は、

      • resの最後にview[i]を挿入

  • 解像度を返す

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

from collections import deque
class TreeNode:
   def __init__(self, data, left = None, right = None):
      self.val = data
      self.left = left
      self.right = right
class Solution:
   def solve(self, root):
      view = {}
      q = deque()
      q.append((root, 0))
      start = float("inf")
      end = float("-inf")
      while q:
         node, coord = q.popleft()
         start = min(start, coord)
         end = max(end, coord)
            if coord not in view:
               view[coord] = node.val
            if node.left:
               q.append((node.left, coord - 1))
            if node.right:
               q.append((node.right, coord + 1))
         res = []
         for i in range(start, end + 1):
            if i in view:
               res.append(view[i])
         return res
ob = Solution()
root = TreeNode(5)
root.left = TreeNode(3)
root.right = TreeNode(8)
root.right.left = TreeNode(7)
root.right.right = TreeNode(6)
root.right.left.left = TreeNode(2)
root.right.right.right = TreeNode(9)
print(ob.solve(root))

入力

root = TreeNode(5) root.left = TreeNode(3) root.right = TreeNode(8)
root.right.left = TreeNode(7) root.right.right = TreeNode(6)
root.right.left.left = TreeNode(2) root.right.right.right =
TreeNode(9)

出力

[3, 5, 8, 6, 9]

  1. Pythonでバイナリツリーの任意のパスの最大合計を見つけるプログラム

    二分木があるとすると、ルートノードからリーフノードに向かうパスの最大の合計を見つける必要があります。 したがって、入力が次のような場合 その場合、出力はルートからのように29になります。パス5-<9- <7- <8をたどると、加算後は29になります。 これを解決するために、次の手順に従います- 関数walk()を定義します。これはノードを取ります、s ノードがnullの場合、 max_sum:=max_sumとsの最大値 戻る s:=s+ノードのデータ ウォーク(ノードの左側、s) ウォーク(ノードの右側、s) 主な方法から次の

  2. Pythonで二分木の最大幅を見つけるプログラム

    二分木があるとすると、ツリー内の任意のレベルの最大幅を見つける必要があります。ここで、レベルの幅は、左端のノードと右端のノードの間に保持できるノードの数です。 したがって、入力がのような場合 その場合、出力は2になります これを解決するために、次の手順に従います- マップdを作成し、最小値と最大値を保持するには、最小値は最初は無限大で、最大値は0です 関数dfs()を定義します。これはルートを取ります、pos:=0、depth:=0 ルートがnullの場合、戻り値はありません d [depth、0] =d [depth、0]とposの最小値 d [d