很基础的树题。因为不熟C++语法和特性,卡了相当一阵子。
Java用惯了,还真是不习惯C++的内存管理。Java中内存管理是由垃圾回收机制负责的,以后用不到的,它自动收回,以后还会用到的,你不用担心它的内存会被占用。
但是C++不一样,出了函数域,你再留着它局部变量的指针又如何,该给你占用还给你占用,根本没人管。搞了半天才懂,哦,这里要用malloc。
弄了个左孩子右兄弟二叉树来模拟树形目录结构,这个结构有先后次序的记忆。用正常的树也行,只是觉得不如这个看着舒服。
算法没什么好说的,树的遍历,插入节点,这都忘光了。但我手动写了出来,只是在内存管理上卡了那么长时间= =这错误出的也很奇葩,我一直以为是算法问题,没想到是语言特性啊。
77ms,终于上榜一回,我能理解,因为树题够吓唬人的,导致提交的人是如此之少。但是有一个事情让我非常的费解——居然有人只用了7ms?给大神们跪了。
PS:请自动忽略我只malloc不free的写法,这是OJ。如果实际做项目这么写,相信我,有一次,你就死定了,好感度-200000。
/*
USER_ID: test#aa3615058
PROBLEM: 91
SUBMISSION_TIME: 2014-03-28 16:40:46
*/
#include <string.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
enum Kind{dir, file};
typedef struct Node {
char name[25];
Kind kind;
Node* child;
Node* brother;
}Node;
void createNode(Node* root, char* name, char* dirName, Kind kind);
void listNode(Node* root, char* dirName, Kind kind);
int main() {
int n;
cin >> n;
for(int i = 0; i < n; i++) {
Node root = {"root",dir,NULL,NULL};
Node *proot = &root;
int m;
cin >> m;
for(int j = 0; j < m; j++) {
char command[15];
char arg1[25];
char arg2[25];
cin >> command;
if(strcmp(command, "CREATEFILE") == 0) {
cin >> arg1;
cin >> arg2;
createNode(proot, arg1, arg2, file);
} else if(strcmp(command, "CREATEDIR") == 0) {
cin >> arg1;
cin >> arg2;
createNode(proot, arg1, arg2, dir);
} else if(strcmp(command, "LISTFILE") == 0) {
cin >> arg1;
listNode(proot, arg1, file);
} else if(strcmp(command, "LISTDIR") == 0) {
cin >> arg1;
listNode(proot, arg1, dir);
}
}
}
return 0;
}
void createNode(Node* root, char* name, char* dirName, Kind kind) {
if(root->kind == dir && strcmp(root->name, dirName) == 0) {
Node* pFile = (Node*)malloc(sizeof(Node));
strcpy(pFile->name, name);
pFile->kind = kind;
pFile->child = NULL;
pFile->brother = NULL;
Node* brothers = root->child;
if(brothers == NULL) {
root->child = pFile;
} else {
while(brothers->brother != NULL) {
brothers = brothers->brother;
}
brothers->brother = pFile;
}
} else {
if(root->child) {
createNode(root->child, name, dirName, kind);
}
if(root->brother) {
createNode(root->brother, name, dirName, kind);
}
}
}
void listNode(Node* root, char* dirName, Kind kind) {
if(root->kind == dir && strcmp(root->name, dirName) == 0) {
Node* files = root->child;
while(files) {
if(files->kind == kind) {
cout<<files->name<<endl;
}
files = files->brother;
}
} else {
if(root->child) {
listNode(root->child, dirName, kind);
}
if(root->brother) {
listNode(root->brother, dirName, kind);
}
}
}