非递归的先序遍历与非递归的中序遍历

麻烦圈中大佬帮忙分析一下这两个写的对么?

具体思想如下:
非递归实现的先序遍历
:步骤一:
首先访问该结点的数据(非空打印数据)
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

你可能感兴趣的:(java,算法,数据结构)