我在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'这样的字符串?对不起,如果之前已经问过这个问题,但我无法在任何地方找到它。提前致谢
答案 0 :(得分:3)
您需要连接递归结果,因此每次都返回一个字符串:
return 'l' + rotation_type(bst, ptr.left)
进一步评论:
使用<something> is None
和<something> is not None
来测试None
值; None
是单身人士。
我会使用None
作为默认值,而不是签名中的字符串。
None
是一个假名值,您可以使用if ptr.left
和if 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 ''
您仍然可以改进代码,但我将此作为练习。