返回字符串创建元组Python递归

返回字符串创建元组Python递归,python,python-3.x,recursion,tuples,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 pt

我在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”这样的字符串?很抱歉,如果以前有人问过这个问题,我在任何地方都找不到。提前感谢

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

return 'l' + rotation_type(bst, ptr.left)
进一步评论:

  • 使用
    为无
    为非无
    测试
    值<代码>无是单例

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

  • None
    是一个错误的值,如果ptr.left和
    如果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 ''

是的,一个简单的解决方法是在元组
上使用字符串串联
+

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 ''

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

在函数末尾,应该有
返回“”
,以避免
str
concat错误谢谢,不敢相信我没有想到这一点。对于两个子节点都存在的节点,应该返回什么?节点是平衡的,但是你可能想在两个子节点中递归?如果两个子节点都存在,我已经得到了函数,如果没有,我调用这个函数谢谢,不敢相信我没有想到这个。我会接受鬼魂的解决方案,因为他是第一个。
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 ''