私はPythonで関数を作ろうとしていますが、これを行うためにBSTクラスを全く変更したくありませんでした。この関数は、最も深いノードに対するルートのパスの合計を見つけることです。同じ深さのノードが複数ある場合は、それらの最大合計を探して返します。私は(基本的なBSTクラスを使用して)これまでに得たもの二分探索木の最も深い部分を見つける関数
クラスBTNODE(オブジェクト):
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
しばらくの間、これを解決するためのアルゴリズムをしようとした後、私が思い付きました上記のカップルが失敗し、コード化する方法がわかりませんでした。
アルゴリズム:
私はこれが仕事だと思う:
我々はルートから開始します。 (ノードに子供がいないときのように葉に当たったとき、左か右の子供がいないとき、また左の右がないとき、または右の左がないときはいつでもそうだと思うベースケース
まず、左のサブツリーをチェックし、その深さを取得します。これをdepth_Lと呼んでいます。次に、私は右のサブツリーをチェックし、それをdepth_Rと呼び、深さとその合計を求めます。
第2の条件は、等しいかどうか、等しいかどうか、2つの深度の最大値を取ることです。そうでなければ、誰が最高の深さを持っているかを見て、その合計を得ようとします。
今私はいくつかのことをする方法を知らなかったです。
1:私はこの練習をしようが、私は私ができるとは思わないと私は本当に感謝しながら、誰かが代わりに私にいくつかのクールなヘルパー関数を示すことができていることを回避しようとしているので、私は、オプションのパラメータを学んだことはありません。
2:私が必要とするのは、右側または左側の合計ではありません。私が言及した部分に貼り付け
def deepest_sum(self, bsum = 0, depth = 0):
# The root is in every path so
bsum = bsum + self.data
depth = depth + 1
# Base case whenever we find a leaf
if self.left == None and self.right == None:
result = bsum,depth
elif self.left is not None and self.right is None:
pass
elif self.left is None and self.right is not None:
pass
else:
# Getting the left and right subtree's depth as well as their
# sums, but once we hit a leaf it will stop
# These optional parameters is messing me up
if self.left:
(sums1, depth_L) = self.left.deepest_sum(bsum,depth)
if self.right:
(sums2, depth_R) = self.right.deepest_sum(bsum,depth)
# The parameter to check if they are equal, the highest goes through
if depth_L == depth_R:
result = max(sums1, sums2), depth_R
else:
if depth_L > depth_R:
result = sums1, depth_L
else:
result = sums2, depth_R
return result
:ちょうどパス
(上記のアルゴリズムを使用して相続人は、私の新たな試みを)取得する方法を考えるために混乱のその種。
>>> BST(8, BST(7, BST(10), BST(11)), BST(6, BST(11), BST(9, None, BST(14)))
37 (depth 3 is the highest so 8 + 6 + 9 + 14 is the path)
私はちょうど忘れてしまった、私はちょうど忘れてしまったBSTを入れ、そのバイナリツリーはBSTではありません。
私は私はタプルを与える知っているが、私はいつも、私はちょうどそれがノードの容易な維持トラックだろうと思った、ことを修正するためのヘルパー関数を作ることができます。