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

Pythonでバイナリツリーの最長の連続パスの長さを見つけるプログラム


二分木があるとしましょう。二分木で最長のパスを見つける必要があります。

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

Pythonでバイナリツリーの最長の連続パスの長さを見つけるプログラム

連続する最長のシーケンスが[2、3、4、5、6]であるため、出力は5になります。

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

  • rootがnullの場合、
    • 0を返す
  • maxPath:=0
  • 関数helper()を定義します。これはノードを取ります
  • inc:=1、dec:=1
  • ノードの左側がnullでない場合、
    • [left_inc、left_dec]:=ヘルパー(ノードの左側)
  • それ以外の場合、
    • [left_inc、left_dec]:=[0、0]
  • ノードの権利がnullでない場合、
    • [right_inc、right_dec]:=ヘルパー(ノードの右側)
  • それ以外の場合、
    • [right_inc、right_dec]:=[0、0]
  • ノードの左側がnullでなく、ノードの値-ノードの左側の値が1と同じ場合、
    • inc:=最大incおよび(left_inc + 1)
  • それ以外の場合、ノードの左側がnullでなく、ノードの値-ノードの左側の値が-1と同じである場合、
    • dec:=decの最大値と(left_dec + 1)
  • ノードの権利がnullでなく、ノードの値-ノードの権利の値が1と同じ場合、
    • inc:=最大incおよび(right_inc + 1)
  • それ以外の場合、ノードの権利がnullでなく、ノードの値-ノードの権利の値が-1と同じである場合、
    • dec:=decの最大値と(right_dec + 1)
  • ノードの左側がnullでなく、ノードの右側がnullでなく、ノードの左側の値-ノードの値が1であり、ノードの値-ノードの右側の値が1である場合、
    • maxPath:=maxPathの最大値と(left_dec + right_inc + 1)
  • それ以外の場合、ノードノードの左側がnullでなく、ノードの右側がnullでなく、ノードの左側の値-ノードの値が-1と同じである場合、
    • maxPath:=maxPathの最大値と(left_inc + right_dec + 1)
  • maxPath:=maxPath、inc、decの最大値
  • return inc、dec
  • メインの方法から次の手順を実行します。
  • helper(root)
  • maxPathを返す

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

class TreeNode:
   def __init__(self, data, left = None, right = None):
      self.val = data
      self.left = left
      self.right = right
     
def print_tree(root):
   if root is not None:
      print_tree(root.left)
      print(root.val, end = ', ')
      print_tree(root.right)

class Solution:
   def solve(self, root):
      if not root:
         return 0
      self.maxPath = 0

      def helper(node):
         inc, dec = 1, 1
         if node.left:
            left_inc, left_dec = helper(node.left)
         else:
            left_inc, left_dec = 0, 0
         if node.right:
            right_inc, right_dec = helper(node.right)
         else:
            right_inc, right_dec = 0, 0

         if node.left and node.val - node.left.val == 1:
            inc = max(inc, left_inc + 1)
         elif node.left and node.val - node.left.val == -1:
            dec = max(dec, left_dec + 1)

         if node.right and node.val - node.right.val == 1:
            inc = max(inc, right_inc + 1)
         elif node.right and node.val - node.right.val == -1:
            dec = max(dec, right_dec + 1)

         if (node.left and node.right and node.left.val - node.val == 1 and node.val - node.right.val == 1):
            self.maxPath = max(self.maxPath, left_dec + right_inc + 1)
         elif (node.left and node.right and node.left.val - node.val == -1
            and node.val - node.right.val == -1):
            self.maxPath = max(self.maxPath, left_inc + right_dec + 1)
           
         self.maxPath = max(self.maxPath, inc, dec)
         return inc, dec

      helper(root)
      return self.maxPath
     
ob = Solution()
root = TreeNode(3)
root.left = TreeNode(2)
root.right = TreeNode(4)
root.right.left = TreeNode(5)
root.right.right = TreeNode(9)
root.right.left.left = TreeNode(6)
print(ob.solve(root))

入力

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

出力

5

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

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

  2. Pythonでの二分木最大パス合計

    空でない二分木が1つあるとします。パスの合計を見つける必要があります。したがって、ここでのパスとは、開始ノードから親子接続が存在するノードまでのノードのシーケンスです。パスには少なくとも1つのノードが含まれている必要があり、ルートノードを通過する必要はありません。したがって、入力ツリーが-の場合 ここで、出力は32になります。 これを解決するには、次の手順に従います- solve()と呼ばれる1つのメソッドを定義します。これはノードを取ります nodeがnullまたはnodeの値が0の場合、0を返します left:=最大0およびsolve(ノードの左側) ri