#include "../CookHeader.h"
#include <filesystem>
using namespace std::filesystem;

typedef struct _TreeNode {
	struct _TreeNode* left = NULL;
	string data;
	struct _TreeNode* right = NULL;
} TreeNode;

Array <TreeNode*> memory;
TreeNode* root;					// 루트 노드 (고정)
Array <string> fnameAry;		// 모든 파일 이름 배열
Array <string> dupFnameAry;		// 중복된 파일 이름 배열

void freeMemory() {
	for (int i = 0; i < len(memory); i++)
		delete memory[i];
}

int main() {
	// 하위 경로의 모든 폴더 이름 및 파일 이름 저장
	string folderName = "C:\\Program Files\\Common Files\\";
	for (auto& f : recursive_directory_iterator(folderName))
		fnameAry.push_back(f.path().filename().string());

	TreeNode* node;
	TreeNode* current; // 현재 노드 작업용(변경)

	node = new TreeNode;
	node->data = fnameAry[0];
	root = node;
	memory.push_back(node);

	for (int i = 1; i < len(frameAry); i++) {
		string name = fnameAry[i];
		node = new TreeNode;
		node->data = name;

		current = root;
		while (true) {
			if (name == current->data) {
				dupFnameAry.push_back(name);
				break;
			}
			if (name < current->data) {
				if (current->left == NULL) {
					current->left = node;
					break;
				}
				current = current->left;
			}
			else {
				if (current->right == NULL) {
					current->right = node;
					break;
				}
				current = current->right;
			}
		}
		memory.push_back(node);
	}

	// 중복된 파일 이름을 한 개만 남김
	sortArray(dupFnameAry);
	setArray(dupFnameAry);

	println(folderName + " 및 그 하위 디렉터리의 중복된 파일 목록 -->");
	printArray(dupFnameAry);

	freeMemory();
}