树的遍历

//解读:根左右,左根右,左右根分别是前序,中序,后序
//*******************************************************
void preorder(BiTree T)
{//先序遍历
	if (T != NULL)
	{
		print(T->data);//访问根节点
		preorder(T->lchild);//遍历左子树
		preorder(T->rchild);//遍历右子树
	}
}

void inorder(BiTree T)
{
	if (T != NULL)
	{
		inorder(T->lchild);//遍历左子树
		print(T->data);//访问根节点	
		inorder(T->rchild);//遍历右子树
	}
}

void postorder(BiTree T)
{
	if (T != NULL)
	{
		postorder(T->lchild);//遍历左子树
		postorder(T->rchild);//遍历右子树
		print(T->data);//访问根节点	
	}
}

void NPreOrderTraverse(BiTree T)
{//非递归先序遍历
	BiTree p;//指向结构体的指针
	SqStack S;
	InitStack(&S);
	Push(&S, (ELEM)T);//根指针入栈
	while (StackEmpty(S))
	{
		while (GetTop(S,(ELEM*)&p) && p) { print(p->data); Push(&S,(ELEM)p->lchild); }
		Pop(&S, (ELEM*)&p);//空指针出栈
		if(StackEmpty(S))
		{
			Pop(&S, (ELEM*)&p); 
			Push(&S, (ELEM)p->rchild);
		}
	}
}

void NInOrderTraverse(BiTree T)
{//非递归中序遍历
	BiTree p;//指向结构体的指针
	SqStack S;
	InitStack(&S);
	Push(&S, (ELEM)T);//根指针入栈
	while (StackEmpty(S))
	{
		while (GetTop(S, (ELEM*)&p) && p)
			Push(&S, (ELEM)p->lchild); //左孩子入栈,一直向左走到尽头
		
		Pop(&S, (ELEM*)&p);//向上走一层,空指针出栈
		if (StackEmpty(S))//如果栈不空说明右孩子没有遍历
		{
			Pop(&S, (ELEM*)&p);//p为弹出的元素
			print(p->data);//输出栈顶元素
			Push(&S, (ELEM)p->rchild);
		}
	}
}

void NPostOrderTraverse(BiTree T)
{//非递归后序遍历
	BiTree p,r;//指向结构体的指针
	SqStack S;
	int flag;
	InitStack(&S);
	Push(&S, (ELEM)T);//根指针入栈
	while (StackEmpty(S))
	{//左孩子走到头,看有没有右孩子,有右孩子从右孩子开始继续向左走到头
		while (GetTop(S, (ELEM*)&p) && p)  Push(&S, (ELEM)p->lchild); 
		Pop(&S, (ELEM*)&p);//空指针出栈
		while ((flag = GetTop(S, (ELEM*)&r)) && r->rchild == p)
		{
			print(r->data);
			Pop(&S, (ELEM*)&p);
		}
		if (flag)
			Push(&S, (ELEM)r->rchild);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值