二叉树的建立和遍历

建立

二叉树的建立就是一个递归的过程

首先我们在结构体中定义一个data,和两个结构体类型的指针,放别用来存放结点数据和分别指向左右孩子【lchild,rchild】

这里我将数据为空格当作树的每一个分支的结束标志,将叶子结点的lchild或rchild指向NULL,若输入数据不为空格,则继续进行递归创建

代码实现:

BiTree create_bitree(BiTree &T){
//注意此处的参数,如果直接加&,就代表直接使用main函数中的指针
//进行操作;
//如果不使用&,就必须使用二重指针,如果使用Bitree T在函数结束后内存
//便会自动释放,以为T只是指向了内存块,而不是指向你所开辟的那一块内存
	char c;
	scanf("%c", &c);
	
	if(' ' == c)
	{
		T = NULL;
	}
	else
	{
		T = (BiNode *)malloc(sizeof(BiNode));
		T->data = c;
		create_bitree(T->lchild);
		create_bitree(T->rchild);
	}
	return T; 
}

参数为二重指针:

elemtype create_bitree(BiTree *T){
	
	char c;
	scanf("%c", &c);
	
	if(' ' == c)
	{
		*T = NULL;
	}
	else
	{
		*T = (BiNode *)malloc(sizeof(BiNode));
		(*T)->data = c;
		create_bitree(&(*T)->lchild);
		create_bitree(&(*T)->rchild);
	}
}

遍历

二叉树共有三种遍历方法:

		先序遍历
		中序遍历
		后序遍历

代码实现时其实特别方便,因为我们只需要控制输出的顺序就可以了;因为这个一个递归的过程,所以每一个结点都会访问三次,但是访问结点不一定非要进行输出操作

先序遍历:

elemtype visit(char c,int level){
	
	printf("%c 位于第 %d 层\n", c, level);
} 

//先序遍历二叉树
elemtype travel_bitree(BiTree T, int level){
	
	if(T)
	{
		visit(T->data, level);
		travel_bitree(T->lchild, level+1);
		travel_bitree(T->rchild, level+1);
		
	}
} 

中序遍历:

elemtype visit(char c,int level){
	
	printf("%c 位于第 %d 层\n", c, level);
} 

//中序遍历二叉树
elemtype travel_bitree(BiTree T, int level){
	
	if(T)
	{
		travel_bitree(T->lchild, level+1);
		visit(T->data, level);
		travel_bitree(T->rchild, level+1);
		
	}
} 

后序遍历:

elemtype visit(char c,int level){
	
	printf("%c 位于第 %d 层\n", c, level);
} 

//后序遍历二叉树
elemtype travel_bitree(BiTree T, int level){
	
	if(T)
	{
		travel_bitree(T->lchild, level+1);
		travel_bitree(T->rchild, level+1);
		visit(T->data, level);
		
	}
} 

以下是先序遍历的全部代码:

#include<stdio.h>
#include<stdlib.h>

typedef char elemtype;
typedef struct BiNode{
	
	elemtype data;
	struct BiNode *lchild,*rchild;
}BiNode,*BiTree;


BiTree create_bitree(BiTree &T){

	char c;
	scanf("%c", &c);
	
	if(' ' == c)
	{
		T = NULL;
	}
	else
	{
		T = (BiNode *)malloc(sizeof(BiNode));
		T->data = c;
		create_bitree(T->lchild);
		create_bitree(T->rchild);
	}
	return T; 
}

elemtype visit(char c,int level){
	
	printf("%c 位于第 %d 层\n", c, level);
} 

//先序遍历二叉树
elemtype travel_bitree(BiTree T, int level){
	
	if(T)
	{
		visit(T->data, level);
		travel_bitree(T->lchild, level+1);
		travel_bitree(T->rchild, level+1);
		
	}
} 


int main(){
	
	int level = 1;
	BiTree T = NULL;
	BiTree S = create_bitree(T);
	
	travel_bitree(S,level);
	return 0;
} 
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值