二叉树基本操作之递归与非递归遍历(2)

//递归遍历二叉树

//二叉树的先序遍历
void PreOrderTraverse(BiTree T)
{
	if (T == NULL)
		return;
	printf("%c ", T->val);
	PreOrderTraverse(T->lchild);
	PreOrderTraverse(T->rchild);
}

//二叉树的中序遍历
void InOrderTraverse(BiTree T)
{
	if (T == NULL)
		return;
	InOrderTraverse(T->lchild);
	printf("%c ", T->val);
	InOrderTraverse(T->rchild);
}

//二叉树的后序遍历
void PostOrderTraverse(BiTree T)
{
	if (T == NULL)
		return;
	PostOrderTraverse(T->lchild);
	PostOrderTraverse(T->rchild);
	printf("%c ", T->val);
}




//用栈进行非递归遍历二叉树

//先序遍历
void  Preorder(BiTree root)
{
	pstack pt = (pstack)malloc(sizeof(stack));
	if (!root)
		return;
	StackInit(pt);//栈初始化
	StackPush(pt, root);//入栈
	while (!StackEmpty(pt))
	{
		BiTree pcur = pt->array[(pt->top) - 1];
		printf("%c ", pcur->val);
		StackPop(pt);//出栈
		if (pcur->rchild)
			StackPush(pt, pcur->rchild);
		if (pcur->lchild)
			StackPush(pt, pcur->lchild);
	}
	printf("\n");
}
//中序遍历
void  Inorder(BiTree root)
{
	pstack pt = (pstack)malloc(sizeof(stack));
	if (!root)
		return;
	StackInit(pt);
	BiTree pcur = root;
	while (!StackEmpty(pt) || pcur)
	{
		while (pcur)
		{
			StackPush(pt, pcur);
			pcur = pcur->lchild;
		}
		pcur = pt->array[pt->top - 1];
		StackPop(pt);
		printf("%c ", pcur->val);
		pcur = pcur->rchild;
	}
	printf("\n");
}
//后序遍历
void  Postorder(BiTree root)
{
	pstack pt = (pstack)malloc(sizeof(stack));
	if (!root)
		return;
	StackInit(pt);
	BiTree pcur = root;
	BiTree prev = NULL;//标记被遍历过的右孩子结点
	while (!StackEmpty(pt) || pcur)//判栈空
	{
		while (pcur)
		{
			StackPush(pt, pcur);
			pcur = pcur->lchild;
		}
		BiTree ptop = pt->array[pt->top - 1];
		//如果ptop的右子树为空,输出根结点,否则从该结点右孩子处继续向下遍历
		//用prve标记已经被遍历过的右孩子,否则会死循环
		if (NULL == ptop->rchild || prev == ptop->rchild)
		{
			printf("%c ", ptop->val);
			prev = ptop;
			StackPop(pt);
		}
		else
		{
			pcur = ptop->rchild;
		}
	}
	printf("\n");
}


//层序遍历,借助队列
void  BiTreeFlow(BiTree pRoot)
{
	Queue q;//q的空间在栈上,队列中节点的空间在堆上
	if (NULL == pRoot)
		return;
	QueueInit(&q);//队列初始化
	QueuePush(&q, pRoot);//入队
	while (!QueueEmpty(&q))//判队空
	{
		BiTree pcur = QueueFront(&q);//获取队头
		QueuePop(&q);
		printf("%c ", pcur->val);
		if (pcur->lchild)
			QueuePush(&q, pcur->lchild);
		if (pcur->rchild)
			QueuePush(&q, pcur->rchild);
	}
	DestoryQueue(&q);//销毁队列
}


//判断二叉树是不是一棵完全二叉树
int Judge(BiTree pRoot)
{
	pq q = (pq)malloc(sizeof(Queue));//借助队列完成
	if (NULL == pRoot)
		return 1;
	QueueInit(q);
	QueuePush(q, pRoot);
	while (!QueueEmpty(q))
	{
		int flag = 0;
		if (flag == 1)
		{
			if (q->base[q->front]->lchild || q->base[q->front]->rchild)
			{
				DestoryQueue(q);
				return 0;
			}
		}
		else
		{
			if (q->base[q->front]->lchild == NULL && q->base[q->front]->rchild == NULL)
			{
				flag = 1;
			}
			if (q->base[q->front]->lchild&& q->base[q->front]->rchild == NULL)
			{
				flag = 1;
			}
			if (q->base[q->front]->lchild == NULL&&q->base[q->front]->rchild)
			{
				return 0;
			}
			if (q->base[q->front]->lchild&&q->base[q->front]->rchild)
			{
				QueuePush(q, q->base[q->front]->lchild);
				QueuePush(q, q->base[q->front]->rchild);
			}
		}
		QueuePop(q);
	}
	return 1;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值