이진 트리의 모든 가능한 순열을 생성하기위한 알고리즘을 찾고 목록을 사용하지 않고이를 수행해야합니다 (트리 자체는있을 수없는 의미와 제한을 가지고 있기 때문입니다. 목록으로 번역). 나는 높이가 3 이하인 나무에서 작동하는 알고리즘을 발견했지만, 높이가 올라갈 때마다 높이 당 가능한 순열 세트가 하나씩 느슨해졌습니다.리스트를 사용하지 않고 이진 트리를 허용하기
각 노드는 원래 상태에 대한 정보를 전달하므로 한 노드가 가능한 모든 순열이 해당 노드에 대해 시도되었는지 확인할 수 있습니다. 또한, 노드는 날씨에 대한 정보를 전달하거나 '스왑 된'것이 아니라, 즉 가능한 모든 순열을 볼 수있는 경우 서브 트리입니다. 트리는 왼쪽 중심에 놓여 있습니다. 즉, 오른쪽 노드는 항상 (이 알고리즘에 대해 커버 할 필요가없는 경우를 제외하고는) 리프 노드이고, 왼쪽 노드는 항상 리프 또는 분기 중 하나 여야합니다.
내가 지금 사용하고 알고리즘은 다음과 같은 종류의 설명 될 수 있습니다 : 등등
branch
/ |
branch 3
/ |
branch 2
/ |
0 1
branch
/ |
branch 3
/ |
branch 2
/ |
1 0 <-- first swap
branch
/ |
branch 3
/ |
branch 1 <-- second swap
/ |
2 0
branch
/ |
branch 3
/ |
branch 1
/ |
0 2 <-- third swap
branch
/ |
branch 3
/ |
branch 0 <-- fourth swap
/ |
1 2
과 :
는if the left child node has been swapped
swap my right node with the left child nodes right node
set the left child node as 'unswapped'
if the current node is back to its original state
swap my right node with the lowest left nodes' right node
swap the lowest left nodes two childnodes
set my left node as 'unswapped'
set my left chilnode to use this as it's original state
set this node as swapped
return null
return this;
else if the left child has not been swapped
if the result of trying to permute left child is null
return the permutation of this node
else
return the permutation of the left child node
if this node has a left node and a right node that are both leaves
swap them
set this node to be 'swapped'
알고리즘으로의 원하는 동작은 다음과 같이 될 것이다 ...
냄새는 숙제와 비슷하지만 실제 노력을 기울인 것처럼 보입니다. 그렇기 때문에 숙제 스타일의 일반적인 질문보다 훨씬 좋습니다. 그럼에도 불구하고, 그 데이터 구조는 숙제에도 불구하고 퍼뮤팅 (permuting)을 위해 매우 열악합니다. – Welbog
나는 그것이 숙제가 아니기 때문에 두려워한다. (나는 그랬 으면 좋겠다.) 나는이 직업에 대한 실제 직업을 가지고있다. ;;) –
Oh 와우. 이건 정말 짜증나. 왜냐하면 이것은 미친 문제 같아. 내가 무엇을 생각해 낼지 알게 될거야. – Welbog