2017-10-29 1 views
2

파이썬에서 재귀 적 메서드가 있습니다. 도움이되는지 확실하지 않지만 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

* 두 자녀 *가 모두있는 노드에 대해 반환해야 할 내용은 무엇입니까? 그러면 노드는 균형을 이루지 만 둘 다 자식에서 반복적으로 재귀를 원할 수 있습니다. –

+0

두 함수가 모두있는 경우 이미 함수가 있습니다.이 함수를 호출하는 경우 함수의 끝에서 –

답변

3

:

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

또한 말 :

  • 사용 <something> is None<something> is not NoneNone 값을 테스트하기를, None은 (는) 싱글 톤입니다.

  • 나는 서명의 문자열이 아닌 None을 기본값으로 사용합니다.

  • None은 거짓 값이며 if ptr.leftif ptr.right 만 사용할 수 있습니다.

  • 두 자녀가 모두없는 경우에 대비하여 반환해야합니다.

향상된 버전 :

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

당신은 또한 빈 문자열 경우를 반환해야 :

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

도 호출합니다. '반환' '이 있어야합니다.'None' 및'str' concat 오류 –

+0

감사합니다. 나는 이것을 생각하지 않는다고 생각하지 않는다. –

3

예, 쉽게 수정 사용 튜플 , 이상 문자열 연결 +입니다 그렇지 않으면 우리는 문자열을 None 타입으로 연결하게 될 것이기 때문에 아무것도 반환되지 않습니다 (마지막 라인). rror. 이 일반적으로 자리이기 때문에

나는 대신 정말 좋은 이유가, 더미 이상 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 ''

당신은 여전히 ​​코드를 향상시킬 수 있지만, 내가로서이를 떠나 운동.

+0

감사합니다. 나는 이것을 생각하지 않았다는 것을 믿을 수 없습니다. 유령의 해결책은 그가 처음이기 때문에 받아 들일 것입니다. –