Pythonで二分木の最長交互パスの長さを見つけるプログラム
二分木があるとすると、左と右の子を交互に繰り返して下る最長のパスを見つける必要があります。
したがって、入力が次のような場合
交互のパスが[2、4、5、7、8]であるため、出力は5になります。
これを解決するには、次の手順に従います。
- rootがnullの場合、
- 0を返す
- 関数dfs()を定義します。これには、ノード、カウント、フラグが必要です
- ノードがnullでない場合、
- フラグがTrueと同じ場合、
- a:=dfs(ノードの左側、カウント+ 1、False)
- b:=dfs(ノードの右側、1、True)
- それ以外の場合、フラグがFalseと同じ場合、
- a:=dfs(ノードの右、カウント+ 1、True)
- b:=dfs(ノードの左側、1、False)
- a、bの最大値を返す
- フラグがTrueと同じ場合、
- 返品数
- メインの方法から次の手順を実行します。
- a:=dfs(ルートの左側、1、False)
- b:=dfs(ルートの右、1、True)
- a、bの最大値を返す
理解を深めるために、次の実装を見てみましょう。
例
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): if not root: return 0 def dfs(node, count, flag): if node: if flag == True: a = dfs(node.left, count + 1, False) b = dfs(node.right, 1, True) elif flag == False: a = dfs(node.right, count + 1, True) b = dfs(node.left, 1, False) return max(a, b) return count a = dfs(root.left, 1, False) b = dfs(root.right, 1, True) return max(a, b) ob = Solution() root = TreeNode(2) root.left = TreeNode(3) root.right = TreeNode(4) root.right.left = TreeNode(5) root.right.right = TreeNode(6) root.right.left.right = TreeNode(7) root.right.left.right.left = TreeNode(8) print(ob.solve(root))
入力
root = TreeNode(2) root.left = TreeNode(3)root.right = TreeNode(4)
root.right.left = TreeNode(5)root.right.right = TreeNode(6)
root.right.left.right = TreeNode(7)root.right.left.right.left = TreeNode(8)
出力
5
-
Pythonで二分木の最長の偶数値パスを見つけるプログラム
二分木があるとすると、ツリー内の任意の2つのノード間の偶数の値で構成される最長のパスを見つける必要があります。 したがって、入力が次のような場合 最長のパスが[10、2、4、8、6]であるため、出力は5になります。 これを解決するには、次の手順に従います- ans:=0 関数find()を定義します。これはノードを取ります ノードがnullの場合、 戻り値(-1、-1) leftCnt:=find(ノードの左側)の戻り値の最大値+ 1 rightCnt:=find(ノードの右側)の戻り値の最大値+ 1 ノードの値が偶数の場合、
-
Pythonでバイナリツリーの任意のパスの最大合計を見つけるプログラム
二分木があるとすると、ルートノードからリーフノードに向かうパスの最大の合計を見つける必要があります。 したがって、入力が次のような場合 その場合、出力はルートからのように29になります。パス5-<9- <7- <8をたどると、加算後は29になります。 これを解決するために、次の手順に従います- 関数walk()を定義します。これはノードを取ります、s ノードがnullの場合、 max_sum:=max_sumとsの最大値 戻る s:=s+ノードのデータ ウォーク(ノードの左側、s) ウォーク(ノードの右側、s) 主な方法から次の