【问题标题】:how to fix the count function如何修复计数功能
【发布时间】:2017-02-27 02:35:24
【问题描述】:
class TN:
    def __init__(self,value,left=None,right=None):
        self.value = value
        self.left  = left
        self.right = right

def list_to_tree(alist):
    if alist == None:
        return None
    else:
        return TN(alist[0],list_to_tree(alist[1]),list_to_tree(alist[2])) 

def str_tree(atree,indent_char ='.',indent_delta=2):
    def str_tree_1(indent,atree):
        if atree == None:
            return ''
        else:
            answer = ''
            answer += str_tree_1(indent+indent_delta,atree.right)
            answer += indent*indent_char+str(atree.value)+'\n'
            answer += str_tree_1(indent+indent_delta,atree.left)
            return answer
    return str_tree_1(0,atree) 

def count(t,value):
    nodes = []
    num = 0
    nodes.append(t)
    while len(nodes) > 0:
        if nodes[0] == value:
            num += 1
        next = nodes.pop(0)
        count(next,value)
    return num

我需要写一个递归函数count(其他三个函数不能改);它通过平衡二叉树和一个值作为参数。它返回值在树中的次数。在下面的二叉树中,count(tree,1) 返回 1,count(tree,2) 返回 2,count(tree,3) 返回 4

..1
....3
3
....3
..2
......2
....3

我调用了以下函数

tree = list_to_tree([3, [2, None, [3, None, None]], [1, [3, None, None], None]])
print('\nfor tree = \n',str_tree(tree))
for i in irange(1,3):
    print('count(tree,'+str(i)+') = ', count(tree,i))

但它显示“RecursionError:比较中超出最大递归深度”的错误 有人可以帮我修复计数功能吗?提前致谢。

【问题讨论】:

  • Python 只能递归这么久stackoverflow.com/questions/3323001/… ... 但是我不认为这应该是您的程序的问题。但是我认为您的退出条件设置不正确。节点的长度是否曾经达到 0?我添加了 print 语句,节点的长度只有 1。这意味着你的 while 循环永远不会退出。
  • 你有无限递归。你先nodes.append(t),然后next = nodes.pop(0)(现在next等于t),然后调用count(t, value)
  • 顺便说一句,您不应该使用 next 作为变量名,因为这会影响内置的 next 函数。

标签: python recursion binary-tree


【解决方案1】:

如果您仔细查看您的代码,您会发现您设置了一个空节点列表,并用 t 填充它,因此始终进入 while 循环您将始终将 t 弹出到 next 并始终精确地调用函数相同的参数。那当然是无限递归。

这是正确设置的一种简单方法:

def count(tree, number):
    if tree is None:
        return 0
    else:
        return (number == tree.value) + count(tree.left, number) \
            + count(tree.right, number)

【讨论】:

  • 嗨,我试过你的代码,但它仍然给我同样的错误。
【解决方案2】:

另一种解决方法是使用横向,在典型的树中,有一个根和一个节点子类。您的树缺少该结构,因此看起来有点奇怪。要使用横向,我使用全局变量来跟踪计数器。

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

def list_to_tree(alist):
    if alist == None:
        return None
    else:
        return TN(alist[0],list_to_tree(alist[1]),list_to_tree(alist[2])) 

def str_tree(atree,indent_char ='.',indent_delta=2):
    def str_tree_1(indent,atree):
        if atree == None:
            return ''
        else:
            answer = ''
            answer += str_tree_1(indent+indent_delta,atree.right)
            answer += indent*indent_char+str(atree.value)+'\n'
            answer += str_tree_1(indent+indent_delta,atree.left)
            return answer
    return str_tree_1(0,atree) 


NUM = 0
def count(t,value):
    global NUM
    NUM = 0
    if t != None:
      if t.left == None and t.right == None:
        if t.value == value:
          return 1
        else:
          return 0
      else:
        _count(t, value)
    return NUM


def _count(t, value):
    if t.left != None:
        _count(t.left, value)

    if t.value == value:
        global NUM
        NUM += 1

    if t.right != None:
        _count(t.right, value)


tree = list_to_tree([3, [2, None, [3, None, None]], [1, [3, None, None], None]])
print(str_tree(tree))
print("count 1", count(tree, 1))
print("count 2", count(tree, 2))
print("count 3", count(tree, 3))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多