递归地对二叉树进行遍历的做法比较好理解。有一颗树,长成这个样子。
下面分别是对它进行三序遍历的结果:
前序递归
//前序递归
void pre_order(link t, void (*visit)(link))
{
if(!t)
return;
visit(t);
pre_order(t->l, visit);
pre_order(t->r, visit);
}
前序遍历输出结果
中序递归
//中序递归
void in_order(link t, void (*visit)(link))
{
if(!t)
return;
in_order(t->l, visit);
visit(t);
in_order(t->r, visit);
}
中序遍历输出结果
后序递归
//后序递归
void post_order(link t, void (*visit)(link))
{
if(!t)
return;
post_order(t->l, visit);
post_order(t->r, visit);
visit(t);
}
后序遍历输出结果
递归的写法非常直观好理解。比较困难的是非递归的写法。而且,比较不对称的结果是,三种顺序的非递归写法的难度是不同的。容易程度是,前序>中序>后续。
先从最容易的非递归前序遍历开始。基本思路是,维护一个栈。对于当前节点,输出它,然后依次入栈当前节点的右儿子,左儿子,然后弹栈。不断进行这个过程直到栈空。
//前序非递归
void pre_order_2(link t, void (*visit)(link))
{
if(t==NULL)
return;
std::stack<link> s;
link p = t;
s.push(p);
while(!s.empty())
{
p &#