二叉树的遍历(非递归)整理

二叉树的遍历(非递归)

写在前面

二叉树重要,重要,重要。以下代码每日手撸一遍,深刻理解。

二叉树的先序遍历(非递归)

巧记心法
  • 判断是否为空树
  • 1、右侧入栈(访问,q指向右孩子,不空则入栈)
  • 2、p指向左孩子,为空则弹栈
#define MAX_NODE 50;
void preorderTraverse(BTNode *T){
BTNode *stack[MAX_NODE],*p=T,*q;
int top=0;
if(T==NULL){
	printf("Empty");
}
else{
	do{
		visit(p->data);
		q=p->Rchild;
		if(q!=null){
			//入栈
			stack[++top]=q;
		}
		p=p->Lchild;
		if(p==NULL){
			//弹栈
			p=stack[top];
			top--;
		}
	}while(p!=NULL);
}
}

二叉树的中序遍历(非递归)

巧记心法
  • 判断是否为空树
  • 1、左侧全部入栈
  • 2、当全部出栈时(top=0),设置循环结束标志(bool=0)
  • 3、否则出栈,访问,p指向右孩子
#define MAX_NODE 50;
void InorderTraverse(BTNode *T){
BTNode *stack[MAX_NODE],*p=T;
int bool=1,top=0;
if(T==NULL)
	printf("Empty");
else{
	do{
		while(p!=NULL){
			//左侧全部入栈
			stack[++top]=p;
			p=p->Lchild;
		}
		if(top==0) bool=0;
		else{
			p=stack[top];
			top--;
			visit(p->data);
			p=p->Rchild;
		}
	}while(bool!=0);
}
}

二叉树的后序遍历(非递归)

巧记心法
  • 判断二叉树是否为空
  • 1、左侧全部入栈,且S2全部赋予0
  • 2、当全部出栈时设置循环结束(bool=0)
  • 3、当对应top为0时,p指向S1[top]对应的右孩子,S2[top]=1
  • 4、否则出栈访问,p=null
#define MAX_NODE 50
void PostorderTraverse(BTNode *T){
BTNode *S1[MAX_NODE],*p=T;
int S2[MAX_NODE],top=0,bool=1;
if(T==NULL)
	printf("Empty");
else{
	do{
		while(p!=NULL){
			S1[++top]=p;
			p=p->Lchild;
			S2[top]=0;
		}
		if(top==0)
			bool=0;
		else if(S2[top]==0){
			p=S1[top]->Rchild;
			S2[top]=1;
		}
		else{
			p=S1[top];
			top--;
			visit(p->data);
			p=NULL;
		}
	}while(bool!=0);
}

二叉树的层次遍历

巧记心法
  • 判断二叉树是否为空
  • 1、根结点入队列
  • 2、当队列不空时(front<rear)队首元素出队,p=队首元素,访问p
  • 3、若p的左孩子不空则入队
  • 4、若p的右孩子不空则入队
#define MAX_NODE 50
void levelorderTraverse(BTNode *T)
{
BTNode *Queue[MAX_NODE],*p=T;
int front=0,rear=0;
if(T==NULL)
	printf("Empty");
else{
	Queue[++rear]=p;
	while(front<rear){
		p=Queue[++front];
		visit(p->data);
		if(p->Lchild!=NULL)
			Queue[++rear]=p->Lchild;
		if(p->Rchild!=NULL)
			Queue[++rear]=p->Rchild;
	}
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值