문제를 통해 이진 트리 노드 : 나는 반복적으로 인덱스를 통해 알 수없는 높이의 완벽한 이진 트리에서 노드를 검색 할 수 있어야합니다. 때문에 알 높이 속성재귀 적으로 지수의 폭 첫 번째 인덱스
그것은 합리적 인덱싱의 유일한 형태는 (타이틀 당) 너비 우선 인덱스임을 보인다
0
1 2
3 4 5 6
문제 각 노드가 어려운 것이다 어떤 방향으로 나아갈 지, 그리고 자식 노드에 대한 재귀 적 요청에서 인덱스를 변환하는 방법 ... 아니면 어쩌면 나는 분명히 생각하지 않고있을뿐입니다.
Node Navigate(Index):
Index 0: return this;
Index 1: return Left.Navigate(0);
Index 2: return Right.Navigate(0);
Index 3: return Left.Navigate(1);
Index 4: return Left.Navigate(2);
Index 5: return Right.Navigate(1);
Index 6: return Right.Navigate(2);
...
Index 7: return Left.Navigate(3);
Index 8: return Left.Navigate(4);
Index 9: return Left.Navigate(5);
Index 10: return Left.Navigate(6);
Index 11: return Right.Navigate(3);
Index 12: return Right.Navigate(4);
Index 13: return Right.Navigate(5);
Index 14: return Right.Navigate(6);
패턴은 분명하다 -하지만 어떻게 프로그래밍 방식 일 수있다 - 너무 많은 클럭 사이클을 소모하지 않고 (이있는 임베디드 장치) - Index
에서 노드를 선택하고 해당 노드에 대한 탐색을위한 매개 변수 Index
변환? 쉬운 변형이 빠졌습니까? 실제로 이동 호출 할 때마다 다른 임베디드 장치에서 처리하고 있지만
public class Node
{
public Node Left, Right;
public Node(int levels)
{
if (levels == 0) return;
Left = new Node(levels - 1);
Right = new Node(levels - 1);
}
public Node Navigate(int index)
{
if (index == 0) return this;
// we want 1 based indexing.
int oneBased = index + 1;
// level is how many levels deep we are looking, stored as 1 << depth.
int level = 1;
// find level - it's equal to the highest bit in "oneBased". Find it.
for (int i = oneBased; (i >>= 1) != 0;)
{
level *= 2;
}
// level adjusted for our children.
int subLevel = level >> 1;
// clear our level bit, set our children's level bit.
int childIndex = ((oneBased & ~level) | subLevel) - 1;
// is the node we're looking for over half way through level? go right.
if ((oneBased & subLevel) != 0)
return Right.Navigate(childIndex);
else
return Left.Navigate(childIndex); // otherwise it's in our left tree.
}
}
그것은, 테스트를위한 C 번호입니다, 따라서 필요 : 여기
내가 yurib의 대답에 구축하여 결국 구현입니다 단순히 의사 코드를 따르는 대신 재귀를 위해
List
등을 구축하십시오. 감사합니다. yurib :).
놀라운 답변 !! – noMAD