数据结构之二叉树的构建、遍历

先序遍历:
规则:若二叉树为空,则空操作返回,否则先访问根节点,然后先序遍历左树,在先序遍历右树
先序遍历
中序遍历
规则:若树为空,则空操作返回,否则从根节点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历右子树
中序遍历
后序遍历
规则:若树为空,则空返回操作,否则从左到右先叶子后节点的方式遍历访问左右子树,最后是访问根节点
后序遍历
层序遍历
规则:若树为空,则空操作返回,否则从树的第一层,也就是根节点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序节点逐个访问
层序遍历

代码如下

/*
**二叉树 
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	char data;
	struct node *Rchild;
	struct node *Lchild;
}*TreeNode,adNode;

//建立二叉树 
void CreateTree(TreeNode &bt){
	char da;
	scanf("%c",&da);
	getchar();
	if(da=='#'){
		bt=NULL;
	}else{
		bt=(adNode *)malloc(sizeof(node));
		bt->data=da;
		printf("输入%c的左子树的值: ",bt->data);
		CreateTree(bt->Lchild);
		printf("输入%c的右子树的值: ",bt->data);
		CreateTree(bt->Rchild);
	}	
}

//先序遍历
void Preorder(TreeNode root){
	if(root){
		printf("%c ",root->data);
		Preorder(root->Lchild);
		Preorder(root->Rchild);
	}
} 

//中序遍历
void InOrder(TreeNode root){
	if(root){
		InOrder(root->Lchild);
		printf("%c ",root->data);
		InOrder(root->Rchild);
	}
} 

//后序遍历
void PostOrder(TreeNode root){
	if(root){
		PostOrder(root->Lchild);
		PostOrder(root->Rchild);
		printf("%c ",root->data);
	}
} 

//层序遍历
void CenOrder(TreeNode root){
	int f,r;
	TreeNode p,q[MAX];
	p=root;
	if(p!=NULL){
		f=1;
		q[f]=p;
		r=2;
	}
	while(f!=r){
		p=q[f];
		printf("%c ",p->data);
		if(p->Lchild!=NULL){
			q[r]=p->Lchild;
			r=(r+1)%MAX;
		}
		if(p->Rchild!=NULL){
			q[r]=p->Rchild;
			r=(r+1)%MAX;
		}
		f=(f+1)%MAX;
	}
} 

    
int main(){
	TreeNode tn;
	CreateTree(tn);
	printf("先序遍历: ");
	Preorder(tn);
	printf("\n中序遍历: ");
	InOrder(tn);
	printf("\n后序遍历: ");
	PostOrder(tn);
	printf("\n层序遍历:");
	CenOrder(tn);
	return 0;
} 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值