二叉树的基本操作(代码+注释)

前言:掌握二叉树的基本操作,如二叉树的建立、遍历、结点个数统计、树的层次遍历等。

ps:这里是个人整理的笔记,方便自己后期的复习,若有问题欢迎各位大佬前来指教!

#include<stdio.h>
#include<stdlib.h>
#define MAXNODE 1000
typedef char ElemType;
typedef struct BiNode{
	ElemType data;
	struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;
//创建结点
BiTNode *creatNode(ElemType data){
	BiTNode *node=(BiTNode *)malloc(sizeof(BiTNode));
	node->data=data;
	node->lchild=node->rchild=NULL;
	return node;
} 
//初始化二叉树
void initBiTree(BiTree *bi){
//	如果此时形参仅为一级指针的话,函数内部会生成一个保存一级指针的临时变量 
//	要想改变这个一级指针的指向,就必须传递二级指针,
//	这样,就可以通过二级指针所指向的地址来修改一级指针的指向 
	*bi = NULL;
} 
//由值来创建二叉树
void creatBiTree(BiTree *T){
	ElemType ch;
	scanf("%c",&ch);
	if(ch=='#')
		*T=NULL; //为-1时便不再调用自己,结束递归 
	else { 
//		由根左右的顺序创建结点 
		*T=creatNode(ch); //生成根节点
		//由递归创建子树 
		creatBiTree(&(*T)->lchild);
		creatBiTree(&(*T)->rchild); 
	}	
} 
//自动插入  ------用来创建完全二叉树
void insert(BiTree *bi,ElemType data){
//	先创建结点--->为结点分配一个存储空间
	BiTNode *node=creatNode(data);
	if(*bi==NULL){
		*bi=node;//为空树的话,直接将结点赋给根结点 
	}

	BiTree Queue[MAXNODE];
	int front,rear;
	front=rear=0;
	
	Queue[rear++]=*bi;
	while(front!=rear){

		BiTree temp=Queue[front++];
		if(temp->lchild){ 
			Queue[rear++]=temp->lchild;
		} 
		else{
			temp->lchild=node;
			return;
		}
		if(temp->rchild){
			Queue[rear++]=temp->rchild;
		}
		else{
			temp->rchild = node;
			return;
		}
	} 
} 

//深度优先搜索------->采用递归的思想
//先序遍历
void preOrder(BiTree bi){
	if(bi==NULL){
		return;
	}
	printf("%4c",bi->data);
//	递归
	preOrder(bi->lchild);//先递归遍历左子树,左子树全部遍历完后,再遍历右子树
	preOrder(bi->rchild); 
} 
//中序
void midOrder(BiTree bi){
	if(bi==NULL){
		return;
	}
	midOrder(bi->lchild);
	printf("%4c",bi->data);
	midOrder(bi->rchild);
} 
//后序
void laterOrder(BiTree bi){
	if(bi==NULL){
		return;
	}
	laterOrder(bi->lchild);
	laterOrder(bi->rchild);
	printf("%4c",bi->data);
} 
//宽度优先搜索--->借用队列
void layerOrder(BiTree bi){
	BiTree temp;
	if(bi==NULL){
		return;	
	}
	BiTree Queue[MAXNODE];
	int front,rear;
	front=rear=0;
//	根结点先入队 
	Queue[rear++]=bi;
	while(rear!=front){
		temp=Queue[front++];
		
		if(temp->lchild){
			Queue[rear++]=temp->lchild;
		}
		if(temp->rchild){
			Queue[rear++]=temp->rchild;
		}
		//根节点出队 
		printf("%4c",temp->data);
	}
}
//统计叶子结点的个数-->递归
int countLeaf(BiTree bi){
	if(bi==NULL){
		return 0;
	}
	//判断出叶子结点 并返回1 
	if(bi->lchild==NULL&&bi->rchild==NULL)
    	return 1;
	return countLeaf(bi->lchild)+countLeaf(bi->rchild);
} 
//统计深度
int depth(BiTree bi){
	if(bi==NULL)
	 return 0 ;
	 int m= depth(bi->lchild);
	 int n= depth(bi->rchild);
	 return m>n?m+1:n+1;
} 
int main(){
	BiTree bi = NULL;
	int i,count;
	initBiTree(&bi);
	
	//输入值自动生成二叉树---->生成完全二叉树	
	ElemType data[]={1,2,3,4,5,6,7,8,9}; 
	 for(i=0;i<9;i++){
	 	 
	 	insert(&bi,data[i]);
	 } 
	 //此方法生成二叉树需要判断结点的位置 
     creatBiTree(&bi); 

	 //先序遍历
	 printf("先序遍历:"); 
	 preOrder(bi);
	 printf("\n");
//	 中序
	printf("中序遍历:"); 
	midOrder(bi);
	printf("\n");
//	后序
	printf("后序遍历:");
	 laterOrder(bi);
	 printf("\n");
//	 层次遍历
	printf("层次遍历:");
	layerOrder(bi);
	printf("\n"); 
	//统计叶子结点的个数
	printf("统计叶子结点个数:");
	count=countLeaf(bi);
	printf("%d",count);
	printf("\n"); 
	//统计深度
	count=depth(bi);
	printf("统计深度:",count); 
	printf("\n");
}



 


 

  • 1
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pursuit@H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值