이 문제에서는 두 개의 값 k1과 k2(k1
문제 설명: n1에서 n2까지 트리의 모든 키를 오름차순으로 인쇄합니다.
문제를 이해하기 위해 예를 들어 보겠습니다.
입력:
<강한>
k1 =4, k2 =12
출력: 6, 7, 9
솔루션 접근 방식
중위 순회 를 사용하여 간단하게 문제를 해결할 수 있습니다. 그러나 공간 복잡도는 0(n)이지만 시간의 필요는 O(1) 복잡도에서 해결하는 것입니다. 따라서 이를 위해 특수한 유형의 순회 기술을 사용합니다.
Morris Traversal 을 사용할 것입니다. 스레드 이진 트리를 기반으로 합니다. 스택/대기열이 필요하지 않으며 NULL 포인터를 사용하여 정보를 저장하므로 저장 공간을 O(1)로 줄이는 데 도움이 됩니다.
문제를 해결하기 위한 모리스 순회 작업을 설명하는 프로그램,
예시
#include <iostream>
using namespace std;
struct node {
int data;
struct node *left, *right;
};
node* insertNode(int data) {
node* temp = new node;
temp->data = data;
temp->right = temp->left = NULL;
return temp;
}
void RangeTraversal(node* root, int k1, int k2) {
if (!root)
return;
node* nodeTraversal = root;
while (nodeTraversal) {
if (nodeTraversal->left == NULL) {
if (nodeTraversal->data <= k2 && nodeTraversal->data >= k1)
cout<<nodeTraversal->data<<" ";
nodeTraversal = nodeTraversal->right;
}
else {
node* prevNode = nodeTraversal->left;
while (prevNode->right != NULL && prevNode->right != nodeTraversal)
prevNode = prevNode->right;
if (prevNode->right == NULL) {
prevNode->right = nodeTraversal;
nodeTraversal = nodeTraversal->left;
}
else {
prevNode->right = NULL;
if (nodeTraversal->data <= k2 && nodeTraversal->data >= k1)
cout<<nodeTraversal->data<<" ";
nodeTraversal = nodeTraversal->right;
}
}
}
}
int main() {
node* root = insertNode(6);
root->left = insertNode(3);
root->right = insertNode(2);
root->left->left = insertNode(1);
root->left->right = insertNode(7);
root->right->right = insertNode(9);
cout<<"All BST keys in the given range are \t";
RangeTraversal(root, 4, 10);
return 0;
} 출력
All BST keys in the given range are 7 6 9