2013-01-14 3 views
0

내 AVL 트리 구현의 경우, 왼쪽, 오른쪽 및 부모 포인터 및 균형 변수가있는 노드가 있습니다. 새 노드를 삽입하고 필요한 회전을 수행 할 때마다 왼쪽 하위 트리에서 오른쪽 하위 트리를 빼서 잔액을 업데이트합니다. 문제의이 메서드는 높이를 계산하기 위해 반복적으로 호출합니다. 문제AVL 트리의 로그 조건

방법 : AVL 트리 삽입 시간 복잡도가 나는이 방법이 시간 복잡도에 영향을 생각 O(log n) 때문에

private int getHeight(Node nd){ 
    if (nd != null){ 
     if (nd.getLeft() == null && nd.getRight() == null) 
      return 0; 
     else if (nd.getLeft() == null) 
      return getHeight(nd.getRight()) + 1; 
     else if (nd.getRight() == null) 
      return getHeight(nd.getLeft()) + 1; 
     else 
      return Math.max(getHeight(nd.getLeft()), getHeight(nd.getRight())) + 1; 
    } 
    else return -1; 
} 

내 질문이있다. 그것을 수정하기 위해 무엇을 할 수 있습니까?

답변

1

힌트 : 새 저울을 계산할 때 높이가 필요하지 않습니다. 노드와 왼쪽 및 오른쪽 자식의 이전 균형 값이면 충분합니다.

1

신장이 필요하지 않습니다. 당신은 오래된 균형을 아는 균형을 유지할 수 있습니다. 즉, "이동"할 때마다 잔액을 업데이트 할 수 있도록 아직 작성하지 않은 경우 회전을 조정해야 할 것입니다.

1

각 삽입에서 모든 노드에 대한 균형 계수를 계산할 필요가 없습니다.

노드 2와 노드 2에 도달하는 동안 삽입 된 노드의 상위 노드와 부모 노드를 계산 한 다음 회전해야합니다.

이 방법으로 테마를 회전하는 방법을 모른다면 (회전이 적당 함) 알려주십시오.