【问题标题】:How can I find the depth of a specific node inside a binary tree?如何找到二叉树中特定节点的深度?
【发布时间】:2020-09-08 16:39:54
【问题描述】:

我正在尝试找出解决此问题的递归方法。主要是返回节点所在的二叉树中的级别。

def find_depth(tree, node):
    if node == None:
        return 0 
    else: 
        return max(find_depth(tree.left))
        #recursive solution here 

使用这个类作为值:

class Tree:
    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left  = left
        self.right = right

示例:调用 find_depth(tree, 7) 应该返回 7 在树中的级别。 (2级)

   3
  / \
  7  1  <------ return that 7 is at level 2
 / \  
 9 3   

【问题讨论】:

  • 如何在树中搜索节点?使用相同的逻辑。如果必须往下走节点,返回1 + recursivefunction(),如果找到节点,返回0。
  • 你错过了将孩子添加到你的树中。在当前状态下,类 Tree 仅附加到第一级,因为您没有向子级添加任何级别。
  • 提示:深度记录可能还需要一个参数。当在子树中找不到节点时,应该返回一些特殊的东西。

标签: python recursion binary-tree


【解决方案1】:

也许这就是你要找的东西

    def find_depth(tree, node):
        if node is None or tree is None:
            return 0

        if tree == node:
            return 1

        left = find_depth(tree.left, node)
        if left != 0:
            return 1 + left
        right = find_depth(tree.right, node)
        if right != 0:
            return 1 + right

        return 0

【讨论】:

    【解决方案2】:

    您需要在find_depth 通话中提供有关深度的信息。它可能看起来像这样(假设0 是通知该节点未找到的哨兵):

    def find_depth(tree, node, depth=1):
        if node == None:
            return 0
    
        if tree.value == node:
            return depth
    
        left_depth = find_depth(tree.left, node, depth+1)
        right_depth = find_depth(tree.right, node, depth+1)
        return max(left_depth, right_depth)
    

    然后你用两个参数调用它:x = find_depth(tree, 7)

    【讨论】:

      【解决方案3】:

      递归是一种函数式遗产,因此将其与函数式风格一起使用会产生最佳结果 -

      1. 基本情况:如果输入tree为空,我们无法搜索,返回None结果
      2. 感应式,输入tree 为空。如果tree.data 匹配搜索value,则返回当前深度,d
      3. 归纳,输入tree 不为空,tree.data 不匹配。返回tree.left的递归结果或find.right的递归结果
      def find (t = None, value = None, d = 1):
        if not t:
          return None              # 1
        elif t.value == value:
          return d                 # 2
        else:
          return find(t.left, value, d + 1) or find(t.right, value, d + 1) # 3
      
      class tree:
        def __init__(self, value, left = None, right = None):
          self.value = value
          self.left = left
          self.right = right
      
      t = tree \
        ( 3
        , tree(7, tree(9), tree(3))
        , tree(1)
        )
      
      print(find(t, 7)) # 2
      print(find(t, 99)) # None
      

      您也可以在 tree 类中实现 find 方法

      def find (t = None, value = None, d = 1):
        # ...
      
      class tree
        def __init__ #...
      
        def find(self, value)
          return find(self, value)
      
      print(t.find(7)) # 2
      print(t.find(99)) # None
      

      【讨论】:

        猜你喜欢
        • 2015-03-01
        • 2020-07-19
        • 1970-01-01
        • 2023-03-13
        • 2020-10-24
        • 1970-01-01
        • 2019-04-16
        • 2011-06-20
        • 2022-01-27
        相关资源
        最近更新 更多