void pre_order(BTreeNode *root)
{
if (root == NULL)
return;
printf ("%4c", root->data);
pre_order (root->lchild);
pre_order (root->rchild);
}
// 非递归方式实现前序遍历
void pre1(BTreeNode *root)
{
if(root == NULL)
return;
LinkStack *stack = CreateStack();
BTreeNode* p = root;
while (p != NULL || !StackEmpty(stack))
{
while(p)
{
printf ("%4c", p->data);
Push(stack, p);
p = p->lchild;
}
if (!StackEmpty(stack))
{
Pop (stack, &p);
p = p->rchild;
}
}
}
void mid_order(BTreeNode *root)
{
if (root == NULL)
return;
mid_order (root->lchild);
printf ("%4c", root->data);
mid_order (root->rchild);
}
// 非递归方式实现中序遍历
void mid1(BTreeNode *root)
{
if(root == NULL)
return;
LinkStack *stack = CreateStack();
BTreeNode* p = root;
while (p != NULL || !StackEmpty(stack))
{
while(p)
{
Push(stack, p);
p = p->lchild;
}
if (!StackEmpty(stack))
{
Pop (stack, &p);
printf ("%4c", p->data);
p = p->rchild;
}
}
}
void last_order(BTreeNode *root)
{
if (root == NULL)
return;
last_order (root->lchild);
last_order (root->rchild);
printf ("%4c", root->data);
}
void level_order(BTreeNode *root)
{
if (root == NULL)
return;
LinkQueue * queue = CreateQueue();
EnQueue (queue, root); // 根节点进队
while (!QueueEmpty(queue))
{
// 队头元素出队
BTreeNode* p = NULL;
DeQueue(queue, &p);
printf ("%4c", p->data);
if (p->lchild != NULL)
EnQueue(queue, p->lchild); // 左节点入队
if (p->rchild != NULL)
EnQueue(queue, p->rchild); // 右节点入队
}
free(queue);
}
非递归实现二叉树的前序、中序和顺序遍历
猜你喜欢
转载自blog.csdn.net/weixin_43664746/article/details/85056679
今日推荐
周排行