二叉树的遍历总结
1. 前言
总结了总结关于二叉树的遍历问题包括递归的和非递归的形式。后序遍历的非递归算法真的是。。。
有关树的节点的定义如下
typedef struct node
{
int data;
struct node* lchild;
struct node* rchild;
}node,*pnode;
2.递归形式
递归形式的二叉树遍历算法相对而言,就很简单,只需要把相应的输出放在正确的位置上就可以了。直接上代码
void preorder1(pnode root)//递归形式
{
if (root == NULL)
return;
printf("%d", root->data);
preorder1(root->lchild);
preorder1(root->rchild);
}
void in_order1(pnode root)//递归形式
{
if (root == NULL)
return;
in_order1(root->lchild);
printf("%d", root->data);
in_order1(root->rchild);
}
void post_order(pnode root)
{
if (root == NULL)
return;
post_order(root->lchild);
post_order(root->rchild);
printf("%d", root->data);
}
以上就是递归形式的代码,不做过多的解释了
3.非递归形式
3.1前序遍历
前序遍历的思路
1.搜索当前节点的左孩子并输出压栈
2.当前节点无左孩子时开始弹栈,如果栈中节点没有右孩子,继续弹栈
3.以节点的右孩子作为当前节点重复1-3;
void preoder(pnode root)//非递归前序遍历
{
const int maxn = 105;
pnode stack[maxn];//建栈
int top =-1;
pnode pnew = root;
top++;
stack[top] = root;
printf("%d", pn