2011-01-08 3 views

답변

5

자세한 내용/제약 조건이 없으면 가장 간단한 해결책은 두 트리의 리프 노드를 가져와 제거한 다음 새로 만든 세 노드의 루트로 사용하는 것입니다. 당신의 예에서

: 당신의 나무, 특정 순서에 따라 표시되지 않는 균형을 표시하지 않으며, 다른 제약 조건이 있기 때문에

   30 
    8     9 
5  7   4  20 

이 작동합니다.

모든 잎 노드가 할 것이기 때문에

,이에 아이 링크를 추가, 최악의 경우 (우리가 첫번째 잎이 발생할 때까지 제거, 임의의 순서로 나무 중 하나를 통과에 O ( N) 작업입니다 두 나무 뿌리).

+1

그 알고리즘을 사용하여 결과 트리를 얻는 방법을 모르겠다. 퇴화 된 나무의 최악의 경우에는 O (N)입니다 (연결된 목록). – marcog

+0

@marcog : 당신은 런타임에 대해 옳습니다. 나는 최상위 노드가 발견 될 것이라고 추정했다. 물론 바보. 그래도 트리는 두 번째 트리의 가장 왼쪽 분기를 따라 (임의로) 내려가는 알고리즘을 사용하여 얻을 수 있습니다. –

+0

아, 네가 지금하고있는 일을 알아. 좋은 해결책. +1 – marcog

0

기본 답변은 더 작은 트리의 모든 요소를 ​​큰 트리에 추가하는 것입니다.

또 다른 possiblity가은 (자기 균형 나무) B-나무를 조사하는 것입니다

+0

구현 세부 사항이 더 많은 경우 이보다 더 잘 수행 할 수 있습니다. 그러나 이것이 핵심 기능이 아니라면 너무 많은 최적화를 피해야합니다. 앞으로는 트리의 구현을 변경할 수 있기 때문에 더 좋습니다. –

+2

B-Trees는 구조가 매우 다르며 더 중요하게는 이진 트리가 아닙니다. – marcog

+0

예, 묻는 사람이 그들을 알지 못했다면 나는 그것을 언급하는 것이 좋을 것이라고 생각했습니다 – Kurru

4

왼쪽 자식이없는 노드에 도달 할 때까지 하나의 트리의 왼쪽 자식을 반복 수행하는 두 개의 이진 트리를 병합하는 가장 쉬운 방법 . 그런 다음 다른 트리의 루트를 왼쪽 자식으로 추가하십시오. 예를 들어 결과 트리는 다음과 같습니다.

  8 
     5  7 
    9 
    4 20 
30 

그러나이 예제에서 결과 트리가 어떻게 매우 불균형한지 확인하십시오. 이렇게하면 결과 트리가 비효율적으로 작동합니다. 더 나은 해결책은 두 번째 트리의 노드를 첫 번째 트리에 균등하게 분배하는 것입니다. 이를 달성하는 한 가지 방법은 두 번째 트리의 루트 및 왼쪽 하위 트리를 첫 번째 트리의 왼쪽 하위 트리에, 오른쪽 하위 트리를 오른쪽 하위 트리에 재귀 적으로 추가하는 것입니다. 조금 더 균등하게 분배하려면 각 단계에서 루트를 할당 할 쪽을 무작위로 선택하십시오.

여기서 이진 트리는 이 아니고 이진 검색 트리입니다. 결과 트리가 유효한 BST인지 확인해야하기 때문에 BST로 작업하는 것이 약간 재미 있습니다. 관심있는 사람들은 다음과 같은 문제에 대한 해결책입니다. 트리 1에서 트리 2의 근음 값을 찾습니다.이 값을 찾지 못해 막 다른 곳에 도달하면 트리 2를 값이있는 위치에 삽입하면됩니다. 그것이 나무에 있었습니까? 값을 찾으면 그 노드를 트리 2로 대체 할 수 있습니다. 그런 다음 옮겨진 노드를 루트로하는 서브 트리를 가져 와서 동일한 알고리즘을 사용하여 트리 2에 삽입하십시오.

+0

주어진 샘플에서는 작동하지 않습니다. –

+0

@Tho 설명해주세요. – marcog

+0

정말 그럴 수있는 방법인가요? (나는 최근에 쌍 나무에 녹슬 었어.) – BoltClock