먼저 데이터와 왼쪽 및 오른쪽 노드 자식을 포함하는 트리 노드를 나타내는 구조체를 정의하겠습니다. 이것이 생성될 첫 번째 노드이면 루트 노드이고 그렇지 않으면 자식 노드입니다.
struct Node { int data; struct Node *leftChild, *rightChild; };
다음으로 int 값을 취하여 노드의 데이터 멤버에 할당하는 newNode(int 데이터) 함수를 만듭니다. 함수는 생성된 구조체 노드에 대한 포인터를 반환합니다. 또한 새로 생성된 노드의 왼쪽과 오른쪽 자식은 null로 설정됩니다.
struct Node* newNode(int data) { struct Node* newNode = new Node; newNode->data = data; newNode->leftChild = newNode->rightChild = NULL; return (newNode); }
이제 루트 노드와 삭제할 노드의 데이터 값을 취하는 deleteNode(Node* root, int k) 함수를 만듭니다. 주어진 노드가 부모 노드이면 왼쪽 및 오른쪽 자식도 삭제합니다. 주어진 노드를 삭제한 후 수정된 루트 노드를 반환하는 함수입니다.
Node* deleteLeafNode(Node* root, int k) { if (root == NULL) return nullptr; root->leftChild = deleteLeafNode(root->leftChild, k); root->rightChild = deleteLeafNode(root->rightChild, k); if (root->data == k && root->leftChild == NULL && root->rightChild == NULL) return nullptr; return root; }
마지막으로 삭제 후 트리를 표시하기 위해 inorder 함수에서 트리를 순회하는 inorder(Node* root) 함수가 있습니다.
void inorder(Node* root){ if (root != NULL){ inorder(root->leftChild); inorder(root->rightChild); cout << root->data << " "; } }
예시
값이 k인 리프 노드를 삭제하는 다음 구현을 살펴보겠습니다.
#include <iostream> using namespace std; struct Node { int data; struct Node *leftChild, *rightChild; }; struct Node* newNode(int data){ struct Node* newNode = new Node; newNode->data = data; newNode->leftChild = newNode->rightChild = NULL; return (newNode); } Node* deleteLeafNode(Node* root, int k){ if (root == NULL) return nullptr; root->leftChild = deleteLeafNode(root->leftChild, k); root->rightChild = deleteLeafNode(root->rightChild, k); if (root->data == k && root->leftChild == NULL && root->rightChild == NULL) return nullptr; return root; } void inorder(Node* root){ if (root != NULL){ inorder(root->leftChild); inorder(root->rightChild); cout << root->data << " "; } } int main(void){ struct Node* root = newNode(6); root->leftChild = newNode(7); root->rightChild = newNode(7); root->leftChild->leftChild = newNode(5); root->leftChild->rightChild = newNode(3); root->rightChild->rightChild = newNode(7); deleteLeafNode(root, 7); cout << "Inorder traversal after deleting given leaf node: "; inorder(root); return 0; }
출력
위의 코드는 다음 출력을 생성합니다 -
Inorder traversal after deleting given leaf node: 5 3 7 6