2017-03-16 9 views
2

私は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ではありません。

私は私はタプルを与える知っているが、私はいつも、私はちょうどそれがノードの容易な維持トラックだろうと思った、ことを修正するためのヘルパー関数を作ることができます。

答えて

0

関数がBTNodeのメソッドである必要がない場合は、実装をかなり単純化することができます。次に、深さ&の合計を追跡して、を超えて、の葉を繰り返し、現在の深さと合計を返します。また、あなたがmaxで互いにそれらを直接比較することができ(depth, sum)タプルを返す場合:

class BTNode(object): 
    def __init__(self, data, left=None, right=None): 
     self.data = data 
     self.left = left 
     self.right = right 

def deepest_sum(node, depth=0, current=0): 
    # Base case 
    if not node: 
     return (depth, current) 

    depth += 1 
    current += node.data 

    return max(deepest_sum(node.left, depth, current), 
       deepest_sum(node.right, depth, current)) 

tree = BTNode(8, BTNode(7, BTNode(10), BTNode(11)), BTNode(6, BTNode(11), BTNode(9, None, BTNode(14)))) 
print(deepest_sum(tree)) 

を出力:

(4, 37) 
関連する問題