이진 트리가 주어지면 작업은 전체 이진 트리인지 여부를 확인하는 것입니다. 모든 노드에 0 또는 2개의 자식이 있는 경우 이진 트리를 전체 이진 트리라고 합니다.
예를 들어
입력-1
<강한>
출력:
1
설명: 리프 노드를 제외한 모든 노드에는 두 개의 자식이 있으므로 전체 이진 트리입니다.
입력-2:
<강한>
출력:
0
설명: 노드 2에는 자식이 하나만 있으므로 전체 이진 트리가 아닙니다.
이 문제를 해결하기 위한 접근 방식
주어진 이진 트리가 가득 찼는지 여부를 확인하려면 왼쪽 하위 트리와 오른쪽 하위 트리를 재귀적으로 확인할 수 있습니다.
- 노드와 그 자식이 있는 주어진 바이너리 트리를 입력합니다.
- 부울 함수 isFullBinaryTree(Node*root)는 루트 노드를 입력으로 사용하고 전체 이진 트리이면 True를 반환하고 그렇지 않으면 거짓을 반환합니다.
- 기본 조건에서 루트 노드가 NULL이거나 비어 있으면 True를 반환합니다.
- 왼쪽 하위 트리와 오른쪽 하위 트리가 NULL이거나 비어 있으면 True를 반환합니다.
- 이제 왼쪽 하위 트리와 오른쪽 하위 트리 각각에 대해 재귀적으로 확인하고 출력을 반환해 보겠습니다.
예
#include<iostream>
using namespace std;
struct treenode {
int data;
treenode * left;
treenode * right;
};
struct treenode * createNode(int d) {
struct treenode * root = new treenode;
root -> data = d;
root -> left = NULL;
root -> right = NULL;
return root;
}
bool isFullBinaryTree(struct treenode * root) {
if (root == NULL) {
return true;
}
if (root -> left == NULL and root -> right == NULL) {
return true;
} else if (root -> left and root -> right) {
return (isFullBinaryTree(root -> left) and isFullBinaryTree(root -> right));
}
return false;
}
int main() {
struct treenode * root = NULL;
root = createNode(1);
root -> left = createNode(2);
root -> right = createNode(3);
root -> left -> right = createNode(4);
root -> left -> left = createNode(5);
root -> right -> left = createNode(6);
if (isFullBinaryTree(root)) {
cout << "1" << endl;
} else {
cout << "0" << endl;
}
return 0;
} 위의 코드를 실행하면 다음과 같이 출력이 생성됩니다.
출력
0
설명: 주어진 이진 트리의 모든 리프 노드에는 자식 노드가 없으므로 전체 이진 트리가 아닙니다. 따라서 출력은 0입니다.