#include <stdafx.h>
#include <vector>
#include <queue>
#include <string>
#include <assert.h>
using namespace std;
class CNode
{
public:
CNode(CNode *pNode, const char *pStr)
{
m_pParent = pNode;
m_strName = pStr;
if ( m_pParent!=NULL)
m_pParent->AddChild(this);
}
virtual ~CNode()
{
for (int i=0; i<m_vChildren.size(); i++)
{
CNode *pNode = m_vChildren[i];
delete pNode;
}
m_vChildren.clear();
}
size_t GetChildCount() const
{
return m_vChildren.size();
}
CNode *GetChild(size_t index) const
{
assert(index >=0 && index <m_vChildren.size());
return m_vChildren[index];
}
void RemoveChild(size_t index)
{
assert(index>0 && index<m_vChildren.size());
delete m_vChildren[index];
m_vChildren.erase(m_vChildren.begin()+index);
}
CNode * DetachChild(size_t index)
{
assert(index >=0 && index<m_vChildren.size());
CNode* pChild = m_vChildren[index];
m_vChildren.erase(m_vChildren.begin()+index);
pChild->SetParent(NULL);
return pChild;
}
size_t AddChild(CNode *pNode)
{
m_vChildren.push_back(pNode);
pNode->SetParent(this);
return m_vChildren.size()-1;
}
const char* GetName() const
{
return m_strName.c_str();
}
void SetName(const char *pName)
{
m_strName = pName;
}
void SetParent(CNode * pNode)
{
m_pParent = pNode;
}
public:
void RecursiveTraversal_Pre()
{
printf("%s\t", GetName());
for (int i=0; i<m_vChildren.size(); i++)
{
m_vChildren[i]->RecursiveTraversal_Pre();
}
}
void RecursiveTraversal_Next()
{
for (int i=0; i<m_vChildren.size(); i++)
{
CNode *pChild = m_vChildren.at(i);
pChild->RecursiveTraversal_Next();
}
printf("%s\t", GetName());
}
void RecursiveTraversal_Layer()
{
queue<CNode*> q;
q.push(this);
while ( !q.empty())
{
CNode * pNode = q.front();
printf("%s\n", pNode->GetName());
for ( size_t t=0; t<pNode->GetChildCount(); t++)
{
q.push(pNode->GetChild(t));
}
q.pop();
}
}
private:
vector<CNode*> m_vChildren;
CNode *m_pParent;
string m_strName;
};
int main()
{
CNode* root = new CNode(NULL,"root");
CNode* node1 = new CNode(root,"node_1");
CNode* node2 = new CNode(root,"node_2");
CNode* node3 = new CNode(root,"node_3");
CNode* node4 = new CNode(node1,"node_4");
CNode* node5 = new CNode(node1,"node_5");
CNode* node6 = new CNode(node2,"node_6");
CNode* node7 = new CNode(node3,"node_7");
CNode* node8 = new CNode(node3,"node_8");
printf("后序遍历: \n");
root->RecursiveTraversal_Next();
printf("先序遍历: \n");
root->RecursiveTraversal_Pre();
printf("逐层打印\n");
root->RecursiveTraversal_Layer();
delete root;
return 0;
}
树结构的遍历
最新推荐文章于 2020-07-12 22:37:04 发布