麻烦圈中大佬帮忙分析一下这两个写的对么?
具体思想如下:
非递归实现的先序遍历
:步骤一:
首先访问该结点的数据(非空打印数据)
if(存在左子树)
{访问左子树}
if(存在右子树)
{将右子树压入栈}
步骤二:
如果左子树非空,则重复步骤一
如果左子树为空(结点访问完毕)------>根据栈顶元素指示回退,返回栈顶元素(也就是回退到该结点访问之前压入栈的栈顶元素),并访问栈顶元素的右子树,重复步骤一
如果栈为空,则表示遍历结束
非递归的中序遍历
步骤一:
如果结点有左子树,那么该结点入栈;
如果该结点没有左子树,那么访问该结点的data
访问该结点完成后:
步骤二:
如果该结点有右子树,重复步骤一;
如果结点没有右子树(该结点访问完毕)------>根据栈顶的指示回退,访问栈顶元素(也就是回退到该结点访问之前压入栈的栈顶元素),并访问栈顶元素的右子树,重复步骤一
如果栈为空,表示遍历结束
#pragma region 非递归实现先序遍历
BitNode* visitLeft(BitNode* tmpnode, LinkStack* stack)
{
if (tmpnode == NULL)
{
return NULL;
}
BitNode* tmp = NULL;
tmp = tmpnode;
while ((tmp!=NULL)&& (tmp->lchild != NULL))
{
printf("%d\n", tmp->data);
if (tmp->rchild != NULL)
{
SeqStack_Push(stack, (void*)tmp->rchild);
}
tmp = tmp->lchild;
}
return tmp;
};
void PreOrder(BitNode* Node, LinkStack* stack)
{
BitNode* tmpnode = NULL;
tmpnode = Node;
/*访问本身*/
while (tmpnode!=NULL)
{
printf("%d\n", tmpnode->data);
if (tmpnode->lchild != NULL)
{
//访问左子树
tmpnode = visitLeft(tmpnode->lchild, stack);
}
else
{
if (tmpnode->rchild != NULL)
{
tmpnode = tmpnode->rchild;
printf("%d\n", tmpnode->data);
tmpnode = visitLeft(tmpnode, stack);
}
else
{
if (SeqStack_Size(stack)>0)
{
tmpnode = (BitNode*)SeqStack_Pop(stack);
}
else
{
tmpnode = NULL;
}
}
}
}
}
#pragma endregion
BitNode* goLeft(BitNode* tmpnode, LinkStack* stack)
{
if (tmpnode == NULL)
{
return NULL;
}
BitNode* tmp = NULL;
tmp = tmpnode;
while ((tmp->lchild!=NULL)&&(tmp!=NULL))
{
SeqStack_Push(stack, tmp);
tmp = tmp->lchild;
}
return tmp;
};
#pragma region 非递归中序遍历
void InOrder(BitNode* Node,LinkStack* stack)
{
BitNode* tmpnode = NULL;
tmpnode = Node;
BitNode* tmp = NULL;
/* 找到中序遍历的左子树的开始结点*/
if (tmpnode->lchild!=NULL)
{
tmpnode = tmpnode->lchild;
goLeft(tmpnode, stack);
}
while (tmpnode)
{
if (tmpnode!=NULL)
{
printf("%d\n", tmpnode->data);
}
if (tmpnode->rchild!=NULL)
{
tmpnode = tmpnode->rchild;
goLeft(tmpnode, stack);
}
else/*右子树为空*/
{
if (SeqStack_Size(stack)>0)
{
tmpnode = (BitNode*)SeqStack_Pop(stack);
}
else
{
tmpnode = (BitNode*)NULL;
}
}
}
}
#pragma endregion
本文含有隐藏内容,请 开通VIP 后查看