树结构的遍历

来源:互联网 发布:免费胸卡制作软件 编辑:程序博客网 时间:2024/06/06 19:19
#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;}

原创粉丝点击