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

Pythonの二分木でk長のパスを見つけるプログラム


一意の値を含む二分木があり、別の値kもあるとすると、ツリー内のkの長さの一意のパスの数を見つける必要があります。パスは、親から子へ、または子から親へのいずれかになります。一部のノードが一方のパスに表示され、もう一方のパスには表示されない場合、2つのパスは異なると見なされます。

したがって、入力が次のような場合

Pythonの二分木でk長のパスを見つけるプログラム

k =3の場合、パスは[12,8,3]、[12,8,10]、[8,12,15]、[3,8,10]であるため、出力は4になります。

>

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

  • 関数dfs()を定義します。これはノードを取ります

    • ノードがnullの場合、

      • 1とk-1の数が0のリストを返す

    • 左:=dfs(ノードの左側)

    • right:=dfs(ノードの右側)

    • 0からKの範囲のiの場合、実行

      • ans:=ans + left [i] * right [K-1 --i]

    • res:=0のサイズKのリスト

    • res [0]:=1、res [1]:=1

    • 1からK-1の範囲のiの場合、実行

      • res [i + 1]:=res [i + 1] + left [i]

      • res [i + 1]:=res [i + 1] + right [i]

    • 解像度を返す

  • メインの方法から、次のようにします-

  • ans:=0


  • dfs(root)


  • ansを返す


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

class TreeNode:
   def __init__(self, data, left = None, right = None):
      self.data = data
      self.left = left
      self.right = right
class Solution:
   def solve(self, root, K):
      def dfs(node):
         if not node:
            return [1] + [0] * (K-1)
         left = dfs(node.left)
         right = dfs(node.right)
         for i in range(K):
            self.ans += left[i] * right[K - 1 - i]
         res = [0] * K
         res[0] = res[1] = 1
         for i in range(1, K - 1):
            res[i + 1] += left[i]
            res[i + 1] += right[i]
         return res
      self.ans = 0
      dfs(root)
      return self.ans
ob = Solution()
root = TreeNode(12)
root.left = TreeNode(8)
root.right = TreeNode(15)
root.left.left = TreeNode(3)
root.left.right = TreeNode(10)
print(ob.solve(root, 3))

入力

root = TreeNode(12)
root.left = TreeNode(8)
root.right = TreeNode(15)
root.left.left = TreeNode(3)
root.left.right = TreeNode(10)
3

出力

4

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

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

  2. Pythonのバイナリツリーの最も低い共通の祖先

    二分木があるとします。与えられた2つのノードの中で最も低い共通の祖先ノードを見つける必要があります。 2つのノードpとqのLCAは、実際には、pとqの両方を子孫として持つツリーの最下位ノードです。したがって、二分木が[3,5,1,6,2,0,8、null、null、7,4]のような場合。ツリーは次のようになります- ここで、5と1のLCAは3です これを解決するには、次の手順に従います- ツリーが空の場合は、nullを返します pとqの両方がrootと同じ場合は、rootを返します left:=pとqを使用したルートの左側のサブツリーのLCA right:=pとqを使用したル