방금이 문제를 보았고 올바른 해결책을 제시 할 수 있는지 궁금합니다. 이 문제는 가치뿐만 아니라 노드별로 이진 트리의 두 노드를 교환하는 과정에서 발생합니다. 그래서 이것은 우리가 오른쪽과 왼쪽의 값을 변경해야한다는 것을 의미합니다.트리 두 노드를 바꿀 수있는 순회
그래서 우리는 위의 이미지와 같은 이진 트리 뭔가를 말할 수 있습니다. 처음에 생각한 것은 노드의 inorder 순회를 만들어서 트리를 평탄화시킨 다음 요소를 교체 한 다음 스왑 된 목록에서 트리를 재구성하는 것입니다. 그래서 말 그대로 해결책이
같은 것이 위에서 언급 한 나무의 경우, 중위 순회 이런 목록
1,3,4,6,7,8,10,13,14를 생성하는 것이다 간다. 나는 나무를 평평 이후
지금 나는 여기에 8
=> 1,3,4,6,7,13,10,8,14
(13) 그러나 문제를 교환 이제는 재구성하려고 할 때, 특정 노드가 왼쪽 서브 칠드인지 또는 루트인지 여부와 같은 개별 노드의 위치를 알지 못하기 때문에 그렇게 할 수 없습니다. 따라서 문자 그대로 처음에는 교체 된 노드와 마찬가지로 트리를 재생성 할 수 없습니다.
이제 질문은 내가 각 노드의 위치 정보를 보유하도록 내 순회 알고리즘을 수정할 수 있는지 여부입니다. 그러면 요소를 교체하고 원하는 노드가 교체 된 동일한 이진 트리가 생성되도록 재구성 할 수 있습니까? inorder traversal 중에 개별 노드의 상태/위치를 저장할 수 있습니까?
추신. 포스트 오더를 수행하면 첫 번째 노드와 마지막 노드가 바뀌는 목록을 만들 수 있지만 두 노드를 바꿔야 할 필요는 루트와 오른쪽 요소 일 필요는 없습니다. 두 노드가 될 수 있습니다.
예 여기에 나와있는 트리는 BST입니다. 그러나이 트리는 단지 이진 트리라는 것을 언급했습니다. 따라서 BST는 경우 일 수 있지만 유일한 것은 아닙니다. 두 traversal 모두에 대해서 생각해 보았습니다.하지만, 평탄화를위한 traversal과 binary tree 재구성을위한 traversal 중 하나를 수행 할 때 다시 생각해 보겠습니다. 동일한 이진 트리를 생성하기 위해 재구성 작업을 다시 수행하는 방법은 무엇입니까? 예제를 제공해 줄 수 있습니까? – Ajai