二叉树的遍历分为先序遍历,中序遍历,后序遍历。
这三个遍历的递归实现十分简单。
这是我的一篇博文,关于创建树
现在我先说说先序遍历。
先序就是按照最优先顺序,遍历就是沿一定路径经过路径上所有的节点。在二叉树中,以左为先。
为了分离访问的操作,定义
typedef void (*PVisitFun)(TreeNode*) ;
void Visit(TreeNode* node)
{
cout<<node->data;
}
递归实现
源代码:
void PreOrderVisitR(TreeNode* root,PVisitFun pvisit)
{
if(root == NULL)
return;
pvisit(root);
PreOrderVisitR(root->plc,pvisit);
PreOrderVisitR(root->prc,pvisit);
}
循环实现
考虑到右节点后于左节点展开,所以我用栈现存放右节点的信息,在存放左节点,然后取栈顶元素重复以上操作,则可以得到先序的遍历序列。void PreOrderVisitI(TreeNode* root, PVisitFun pvisit)
{
stack<TreeNode*> visitStack;
visitStack.push(root);
TreeNode* pcurt = NULL;
while ( !visitStack.empty() )
{
pcurt = visitStack.top();
visitStack.pop();
cout<<pcurt->data;
if (pcurt->prc != NULL)
{
visitStack.push(pcurt->prc);
}
if (pcurt->plc != NULL)
{
visitStack.push(pcurt->plc);
}
}
}