二叉树的遍历

遍历顺序


在这里插入图片描述

规律:

先序遍历当第一次遇见结点就输出
中序遍历当第一次遇见结点时不输出,第二次遇见结点时就输出
后序遍历在输出的时候判断一下子树结点是否全都输出,如果全都输出就可以输出此结点

二叉树的递归遍历
1、定义声明
typedef struct TNode *Position;
typedef struct TNode *BinTree;
struct TNode{
	ElemenType Data;
	BinTree left;
	BinTree right;
}; 

2、先序遍历(VLR)
void PreorderTraversal(BinTree BT)
{
	if(BT)
	{
		printf("%d",BT->Data);
		PreorderTraversal(BT->left);
		PreorderTraversal(BT->right);
	}
 }

3、中序遍历(LVR)
 void InorderTraversal(BinTree BT)
 {
 	if(BT)
 	{
 		InorderTraversal(BT->left);
 		printf("%d",BT->Data);
 		InorderTraversal(BT->right);
	 }
 }

4、后序遍历(LRV)
void PostorderTraversal(BinTree BT)
{
	if(BT)
	{
		PostorderTraversal(BT->left);
		PostotderTraversal(BT->right);
		printf("%d",BT->Data);
	}
}

二叉树的非递归遍历
>
中序遍历

使用堆栈,中序遍历正好符合先进后出规则
在这里插入图片描述


void InorderTraversal(BinTree BT)
{
	BinTree T=BT;
	stack S=CreatStack();
	while(T||!IsEmpty(S))//如果树未遍历完或堆栈不为空 
	{
		while(T)//先访问左边,遇到就把它压栈 
		{
			Push(S,T->Data);
			T=T->left;
		 } 
		 if(!IsEmpty(S))
		 {
		 	T=Pop(S);
		 	printf("%d",T->Data);
		 	T=T->right;
		  } 
	}
}

先序遍历非递归算法

相对于中序遍历,只是将输出位置改到上面就行


void PreorderTraversal(BinTree BT)
{
	BinTree T=BT;
	stack S=CreatStack();
	while(T||!IsEmpty(S))//如果树未遍历完或堆栈不为空 
	{
		while(T)//先访问左边,遇到就把它压栈 
		{
			printf("%d",T->Data);
			Push(S,T->Data);
			T=T->left;
		 } 
		 if(!IsEmpty(S))
		 {
		 	T=Pop(S);
		 	
		 	T=T->right;
		  } 
	}
}

后序遍历非递归算法O(参考别人的)—only了解
typedef struct BiTNode{
	int data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
 
typedef struct{
	BiTree data[100];
	int top;
}BiStack;


void PostOrder(BiTree T){	//入栈所有的左子树以及左子树的右子树直到没有可以访问的右子树后退栈。 
	BiTNode *pre = T;	//记录上一次退栈的结点 
	BiTNode *p=T;		//当前访问结点 
	BiStack s ;             //保存结点用的栈
	s.top=0;                //栈底预留,用于保存NULL结束算法。
	s.data[s.top]=NULL;
	while(p||s.top!=0){
		if(p!=NULL&&pre!=p->lchild&&pre!=p->rchild){	//结点不为空且左孩子和右孩子没有访问过 ,入栈左子树 
			s.data[++s.top]=p;
			p=p->lchild;
		}
		else{					
			p=s.data[s.top];						 
			if(p->rchild!=NULL&&pre!=p->rchild){	//右子树不为空且右孩子没有访问过,入栈右子树结点 
				p=p->rchild;
			}
			else{
				printf("%d ",p->data);		//访问到最后的右子树的结点后,退栈。 
				pre=s.data[s.top];
				p=s.data[--s.top];
			}
		}
	}
}

层序遍历队列实现

在这里插入图片描述

void LevelorderTraversal(BinTree BT)
{
	Queue Q;
	BinTree T;
	Q=CreatQueue();
	 
	if(!BT) return ;//如果是空树
	 
	Add(Q,BT);
	while(!IsEmpty(Q))
	{
		T=Delete(Q);
		printf("%d",T->Data);
		if(T->left) Add(Q,T->left);
		if(T->right) Add(Q,T->right);
	}
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值