求二叉树的深度和宽度,深度为最深的层数,宽度为最宽的层宽度;
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
typedef struct tagBiNode {
char data;
struct tagBiNode *left;
struct tagBiNode *right;
} BiNode;
int getWidth(BiNode* head) {
if (head == NULL)
return 0;
queue<BiNode*> q;
q.push(head);
int width = 1, current = 1;
while (!q.empty()) {
while (current--) {
if (q.front()->left != NULL)
q.push(q.front()->left);
if (q.front()->right != NULL)
q.push(q.front()->right);
q.pop();
}
current = q.size();
width = max(width, current);
}
return width;
}
int getHeight(BiNode* head) {
if (head == NULL)
return 0;
return max(getHeight(head->left), getHeight(head->right)) + 1;
}
int GetBiNodeInfo(BiNode &head, unsigned int *pulWidth,
unsigned int *pulHeight) {
*pulWidth = getWidth(&head);
*pulHeight = getHeight(&head);
return 0;
}
int main() {
BiNode dataa = { 'a', NULL, NULL };
BiNode datab = { 'b', NULL, NULL };
BiNode datac = { 'c', NULL, NULL };
BiNode datad = { 'd', NULL, NULL };
BiNode datae = { 'e', NULL, NULL };
BiNode dataf = { 'f', NULL, NULL };
BiNode datag = { 'g', NULL, NULL };
BiNode datah = { 'h', NULL, NULL };
BiNode datai = { 'i', NULL, NULL };
BiNode dataj = { 'j', NULL, NULL };
BiNode datak = { 'k', NULL, NULL };
BiNode datal = { 'l', NULL, NULL };
BiNode datam = { 'm', NULL, NULL };
BiNode datan = { 'n', NULL, NULL };
BiNode datao = { 'o', NULL, NULL };
BiNode datap = { 'p', NULL, NULL };
dataa.left = &datab;
dataa.right = &datac;
datab.left = &datad;
datab.right = &datae;
datac.left = &dataf;
datac.right = &datag;
datad.left = &datah;
datad.right = &datai;
datae.left = &dataj;
datae.right = &datak;
dataf.left = &datal;
dataf.right = &datam;
datag.left = &datan;
datag.right = &datao;
datah.left = &datap;
unsigned int ulWidth = 0;
unsigned int ulHeight = 0;
GetBiNodeInfo(dataa, &ulWidth, &ulHeight);
cout << ulWidth << endl; // 8
cout << ulHeight << endl; // 5
}
内存文件系统,模拟文件和文件夹的创建,移动,与删除;根目录为root,缺省存在,目录名和文件名全局唯一;
#include <iostream>
#include <string>
#include <map>
using std::map;
using std::string;
class Dir;
class File;
class Dir {
public:
Dir(const string dirName) :
dirName(dirName) {
parent = NULL;
}
public:
Dir *parent;
string dirName;
map<string, Dir*> subDirs;
map<string, File*> subFiles;
};
class File {
public:
File(const string fileName) :
fileName(fileName) {
parent = NULL;
}
public:
Dir *parent;
string fileName;
};
Dir *root = new Dir("root");
map<string, Dir*> dirs;
map<string, File*> files;
Dir* findDir(const string& dirName) {
if (dirName == "root")
return root;
map<string, Dir*>::iterator it = dirs.find(dirName);
if (it == dirs.end())
return NULL;
return it->second;
}
File* findFile(const string& fileName) {
map<string, File*>::iterator it = files.find(fileName);
if (it == files.end())
return NULL;
return it->second;
}
Dir* removeFile(const string fileName) {
File *pFile = findFile(fileName);
if (pFile == NULL)
return NULL;
Dir *parent = pFile->parent;
files.erase(fileName);
return parent;
}
Dir* removeDir(const string dirName) {
Dir *pDir = findDir(dirName);
if (pDir == NULL)
return NULL;
if (!pDir->subDirs.empty()) {
map<string, Dir*>::iterator iterDir = pDir->subDirs.begin();
for (; iterDir != pDir->subDirs.end(); ++iterDir) {
removeDir(iterDir->first);
}
}
map<string, File*>::iterator iterFile = pDir->subFiles.begin();
for (; iterFile != pDir->subFiles.end(); ++iterFile) {
removeFile(iterFile->first);
}
Dir *parent = pDir->parent;
delete pDir;
dirs.erase(dirName);
return parent;
}
int CreateDir(const char * ParentDirName, const char * DirName) {
string parentDirName = ParentDirName;
Dir *parentDir = findDir(parentDirName);
if (parentDir == NULL)
return -1;
string dirName = DirName;
if (findDir(dirName) != NULL)
return -1;
Dir *newDir = new Dir(dirName);
parentDir->subDirs[dirName] = newDir;
newDir->parent = parentDir;
dirs[dirName] = newDir;
return 0;
}
void DeleteDir(const char * DirName) {
string dirName = DirName;
Dir *parent = removeDir(dirName);
if (parent != NULL) {
parent->subDirs.erase(dirName);
}
return;
}
int MoveDir(const char * SrcDirName, const char * DestDirName) {
string src = SrcDirName;
string des = DestDirName;
Dir *srcDir = findDir(src);
Dir *desDir = findDir(des);
if (srcDir == NULL || desDir == NULL) {
return -1;
}
if (srcDir->parent == desDir) {
return -1;
}
Dir *desDirCheck = desDir;
while (desDirCheck != root) {
if (desDirCheck == srcDir) {
return -1;
}
desDirCheck = desDirCheck->parent;
}
Dir *srcParent = srcDir->parent;
srcParent->subDirs.erase(srcDir->dirName);
srcDir->parent = desDir;
desDir->subDirs[srcDir->dirName] = srcDir;
return 0;
}
int CreateFile(const char * DirName, const char * FileName) {
string fileName = FileName;
File *pFile = findFile(fileName);
if (pFile != NULL) {
return -1;
}
string dirName = DirName;
Dir *pDir = findDir(dirName);
if (pDir == NULL) {
return -1;
}
pFile = new File(fileName);
files[fileName] = pFile;
pFile->parent = pDir;
pDir->subFiles[fileName] = pFile;
return 0;
}
void DeleteFile(const char * FileName) {
string fileName = FileName;
Dir *parent = removeFile(fileName);
if (parent != NULL) {
parent->subFiles.erase(fileName);
}
return;
}
unsigned int GetFileNum(const char * DirName) {
string dirName = DirName;
Dir *pDir = findDir(dirName);
if (pDir == NULL) {
return 0;
}
unsigned int fileNum = pDir->subFiles.size();
map<string, Dir*>::iterator it = pDir->subDirs.begin();
for (; it != pDir->subDirs.end(); ++it) {
fileNum += GetFileNum(it->first.c_str());
}
return fileNum;
}
void Clear(void) {
dirs.clear();
files.clear();
root->subDirs.clear();
root->subFiles.clear();
return;
}
int main() {
CreateFile("root", "hi1");
CreateFile("root", "hi2");
CreateFile("root", "hi3");
CreateDir("root","a1");
CreateFile("a1","h4");
CreateFile("a1","h5");
CreateFile("a1","h6");
CreateDir("a1","b1");
CreateFile("b1","h7");
std::cout << GetFileNum("root") << "\n"; // 7
std::cout << GetFileNum("a1") << "\n"; // 4
CreateDir("root", "a2");
CreateFile("a2","hi8");
MoveDir("a2","b1");
std::cout << GetFileNum("a1") << "\n"; // 5
removeDir("a1");
std::cout << GetFileNum("root") << "\n"; //3
DeleteFile("hi3");
std::cout << GetFileNum("root") << "\n"; //2
}
原文:http://blog.csdn.net/thisinnocence/article/details/41835813