二叉树简单应用

在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree),接下来我就在这里给大家介绍一下二叉树在算法中的简单使用:

我们要完成总共有(1)二叉树的创建 (2)二叉树的先中后序递归遍历 (3)统计叶子结点的总数 (4)求树的高度 (5)反转二叉树 (6)输出每个叶子结点到根节点的路径 (6)输出根结点到每个叶子结点的路径。

定义二叉树结点类型的结构体

typedef struct node{
	char data;
	struct node *Lchild;
	struct node *Rchild;
}BiTNode,*BiTree;
int cnt=0;//统计叶子节点个数

二叉树的创建

BiTNode *Create(){	//二叉树的先序建立 
	char ch;
	BiTNode *s;
	ch=getchar();
	if(ch=='#')erchashu 
		return NULL;
	s=(BiTNode *)malloc(sizeof(BiTNode));
	s->data=ch;
	s->Lchild=Create();
	s->Rchild=Create();
	return s;
}


二叉树的先序、中序、后序递归遍历

void PreOrder(BiTree root){		//前序遍历 
	if(root){
		printf("%c ",root->data);
		PreOrder(root->Lchild);
		PreOrder(root->Rchild);
	}
}

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

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


统计叶子结点个数:

void LeafCountNode(BiTree root){	//统计叶子结点个数 
	if(root){
		if(!root->Lchild && !root->Rchild)
			cnt++;
		LeafCountNode(root->Lchild);
		LeafCountNode(root->Rchild);
	}
} 

输出各个叶子结点值:

void IInOrder(BiTree root){	//输出各个叶子结点值 
	if(root){
		IInOrder(root->Lchild);
		if(!root->Lchild && !root->Rchild) 
			printf("%c ",root->data);
		IInOrder(root->Rchild);
	}
}


求树的高度:

int PostTreeDepth(BiTree root){				//求树的高度 
	int h1,h2,h;
	if(root==NULL){
		return 0;
	}
	else{
		h1=PostTreeDepth(root->Lchild);
		h2=PostTreeDepth(root->Rchild);
		h=(h1>h2?h1:h2)+1;
		return h;
	}
}

反转二叉树:

void MirrorTree(BiTree root){				//二叉树镜像树 
	BiTree t;
	if(root==NULL)
		return;
	else{
		t=root->Lchild;
		root->Lchild=root->Rchild;
		root->Rchild=t;
		MirrorTree(root->Lchild);
		MirrorTree(root->Rchild);
	}
}

输出每个叶子结点到根节点的路径:

void OutPutPath(BiTree root,char path[],int len){			//输出每个叶子结点到根节点的路径 
	if(root){
		if(!root->Lchild && !root->Rchild){
			printf("%c ",root->data);
			for(int i=len-1;i>=0;i--)
				printf("%c ",path[i]);
			printf("\n");	
		}
		path[len]=root->data;
		OutPutPath(root->Lchild,path,len+1);
		OutPutPath(root->Rchild,path,len+1);
	}
}


输出根到每个叶子结点的路径:

void PrintPath(BiTree root,char path[],int l){			//输出根到每个叶子结点的路径
	int len=l-1;
	if(root){
		if(root->Lchild==NULL && root->Rchild==NULL){
			path[len]=root->data;
			for(int i=9;i>=len;i--)
				printf("%c ",path[i]);
			printf("\n");
		}
		path[len]=root->data;
		PrintPath(root->Lchild,path,len);
		PrintPath(root->Rchild,path,len);
	} 
} 


测试代码:

int main(void){
	int h,len;
	char path[20];
	BiTree root;
	root=Create();
//	PreOrder(root);
//	printf("\n");
//	InOrder(root);
//	printf("\n");
//	PostOrder(root);
//	printf("\n");
//	LeafCountNode(root);
//	printf("叶子结点个数为:%d\n",cnt);
//	IInOrder(root); 
	h=PostTreeDepth(root);
	printf("树的高度为:High=%d\n",h);
//	PrintTree(root,0);
//	MirrorTree(root); 
//	PrintTree(root,0);
//	OutPutPath(root,path,0);
//	PrintPath(root,path,10); 
	return 0;
}

(下一篇讲解二叉树 先序、中序、后序的非递归遍历算法)
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值