二叉树遍历代码--先中后层次

#include <stdio.h> 
#include <stdlib.h>
#define TYPE char
struct Bitree{
	TYPE data;
	struct Bitree *lchild, *rchild;
};
//创建一颗二叉树 
Bitree *create(Bitree *T){
	TYPE data; //当前节点的值
	printf("请输入当前节点的值: data= ");
	scanf("%c", &data);
	getchar();
	if(data != '#'){
		T = (Bitree *)malloc(sizeof(Bitree *));
		T -> data = data;
		T -> lchild = NULL;
		T -> rchild = NULL;
		T -> lchild = create(T -> lchild);
		T -> rchild = create(T -> rchild);
	} 
	return T;
}
//先序遍历
void preOrder(Bitree *T){
	if(T!=NULL){
	printf("%c", T ->data);
	preOrder(T -> lchild);
	preOrder(T -> rchild);
}
//先序遍历(非递归)
void preOrder(BiTree *T){
	InitStack(S); BiTree p = T;
	while(p || IsEmpty(S)){
		if(p){          //一路向左 
		 Visit(p);	push(S,p); //入栈 
			p = p -> lchild;
		}
		else{
			Pop(S,p);
			p = p -> rchild;//如果有则跟以前套路一样遍历 
		}
	}
}
}
//中序遍历
void inOrder(Bitree *T){
	if(T!=NULL){  
	inOrder(T -> lchild);
	printf("%c", T ->data);
	inOrder(T -> rchild);
	}
}
//中序遍历(非递归)
void inOrder(BiTree *T){
	InitStack(S); BiTree p = T;
	while(p || IsEmpty(S)){
		if(p){          //一路向左 
			push(S,p); //入栈 
			p = p -> lchild;
		}
		else{
			Pop(S,p); Visit(p);
			p = p -> rchild;//如果有则跟以前套路一样遍历 
		}
	}
} 
//后序遍历
void postOrder(Bitree *T){
	if(T!=NULL)
	{
	postOrder(T -> lchild);
	postOrder(T -> rchild);
	printf("%c", T ->data);
}
//非递归后序遍历
void PostOrder(BiTree T){
	InitStack(S);
	BiTNode *p = T;
	BiTNode *r = NULL;
	//利用的栈 
	while(p || !IsEmpty(S)){
		if(p){   //走到最左边 
			push(S,p);
			p = p -> lchild;
		}
		else{
			GetTop(S,p);  //这个点已经没有了左子树,就看一下有没有右子树就行
 
			if(p -> rchild && p -> rchild != r)//若右子树存在,且未被访问过
			  p = p -> rchild
			else{
				pop(S,p);//弹出
				visit(p -> data); //没有被访问过且左右都无 
				r = p;
				p = NULL;
			} 
		}
	}
} 
}
//层次遍历
void LevelOrder(BiTree T){
	InitQueue(Q); //利用队列啦、 
	BiTree p;
	EnQueue(Q,T);
	while(!IsEmptt(Q)){
		DeQueue(Q,p);//对头结点出队
		visit(p);  //出去前访问看看两边有没有,有的话入队 
		if(p -> lchild != NULL)
		  EnQueue(Q,p -> lchild);
		if(p ->rchild != NULL)
		  EnQueue(Q, p -> rchild);
	}
} 
int main(){
	Bitree *T = (Bitree *)malloc(sizeof(Bitree *));;
	T = create(T);
	inOrder(T); 
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值