//多叉树递归遍历
//假设树节点定义为:
struct Node{
Node *pPNode;
list childs;
};
//前序遍历(正序遍历):
void EnumNode(Node *pNode)
{
do_something(pNode);
list::iterator iter; //正向遍历器
for(iter=pNode->childs.begin();iter!=pNode->childs.end();++iter)
{
EnumNode(*iter);
}
}
//后序遍历(反序遍历):
void REnumNode(Node *pNode)
{
list::reverse_iterator iter; //反向遍历器
for(iter=pNode->childs.rbegin();iter!=pNode->childs.rend();++iter)
{
EnumNode(*iter);
}
do_something(pNode);
}
//多叉树堆栈遍历
//前序遍历(正序遍历):
void EnumNode(Node *pRoot)
{
stack stack;
stack.push(pRoot);
Node *lpNode;
while(!stack.empty())
{
lpNode = stack.top();
stack.pop();
do_something(lpNode);
list::reverse_iterator iter; //反向遍历器
for(iter=pNode->childs.rbegin();iter!=pNode->childs.rend();++iter)
{
stack.push(*iter);
}
}
}
//后序遍历(反序遍历):
void REnumNode(Node *pRoot)
{
stack stack;
stack.push(pRoot);
Node *lpNode;
Node *lpLastNode=NULL; //保存最近一次处理的节点,或者说某个节点的第一个子节点
while(!stack.empty())
{
lpNode = stack.top();
//lpLastNode!=*lpNode->childs.begin() //起关键性作用,防止再次进入已经处理过的节点
if (lpNode->childs.size() && lpLastNode!=*lpNode->childs.begin())
{
list::iterator iter; //正向遍历器
for(iter=pNode->childs.begin();iter!=pNode->childs.end();++iter)
{
stack.push(*iter);
}
}else{
do_something(lpNode);
lpLastNode=lpNode;
stack.pop();
}
}
}
/*
关于后续遍历,程序流程是这样的:
1.从根出发
2.寻找含有子叶的节点
3.找到后,正序push到堆栈
4.取栈定节点,继续执行第2步
4.直到找到没有子叶的节点
5.开始处理,保存处理的节点指针
6.pop节点, Go Setp 2
注:以上代码非可直接运行代码,