返回字符串会创建Tuple Python递归

时间:2017-10-29 13:27:23

标签: python python-3.x recursion tuples

我在Python中有一个递归方法。不确定它是否有帮助,但它检查不平衡的AVL树是如何的。例如,10,20,30是'rr',30,20,10是'll',10,20,15是'rl',20,10,15是'lr'。
这是我的代码:

def rotation_type(bst, ptr='dummy'):
    if ptr == 'dummy':
        ptr = bst.root
    if ptr.left != None or ptr.right != None:
        if ptr.left != None:
            return 'l', rotation_type(bst,ptr.left)
        else:
            return 'r', rotation_type(bst,ptr.right)

我的代码可以工作,除了它返回一个元组。例如,如果我的二叉树是[10,20,30],则返回('r', ('r', None))。有没有办法只返回像'rr'这样的字符串?对不起,如果之前已经问过这个问题,但我无法在任何地方找到它。提前致谢

2 个答案:

答案 0 :(得分:3)

您需要连接递归结果,因此每次都返回一个字符串:

return 'l' + rotation_type(bst, ptr.left)

进一步评论:

  • 使用<something> is None<something> is not None来测试None值; None是单身人士。

  • 我会使用None作为默认值,而不是签名中的字符串。

  • None是一个假名值,您可以使用if ptr.leftif ptr.right

  • 您需要为两个孩子都缺失的情况返回一些内容。

改进版本:

def rotation_type(bst, ptr=None):
    ptr = ptr or bst.root
    if ptr.left:
        return 'l' + rotation_type(bst, ptr.left)
    elif ptr.right:
        return 'r' + rotation_type(bst, ptr.right)
    else:
        return ''

答案 1 :(得分:3)

是的,一个简单的解决方法是使用字符串连接+而不是元组,

def rotation_type(bst, ptr='dummy'):
    if ptr == 'dummy':
        ptr = bst.root
    if ptr.left != None or ptr.right != None:
        if ptr.left != None:
            return 'l' + rotation_type(bst,ptr.left)
        else:
            return 'r' + rotation_type(bst,ptr.right)
    return ''

如果没有返回任何内容(最后一行),你还必须返回空字符串,否则我们将连接一个字符串和None - 类型,这将是错误的。

我还建议使用None而不是虚拟,因为这通常是占位符,而是有充分的理由不这样做:

def rotation_type(bst, ptr=None):
    if ptr is None:
        ptr = bst.root
    if ptr.left != None or ptr.right != None:
        if ptr.left != None:
            return 'l' + rotation_type(bst,ptr.left)
        else:
            return 'r' + rotation_type(bst,ptr.right)
    return ''

您仍然可以改进代码,但我将此作为练习。