C语言之二叉树(包括遍历的实现)

//头函数
#ifndef __2TREE_H__
#define __2TREE_H__
#include "error.h"

#define TRUE  1
#define FALSE 0

typedef struct _btree
{
	char data;
	struct _btree *rchild;
	struct _btree *lchild;
}Btree;

typedef struct _head
{
	struct _btree *head;
	int count;
}Head;


//创建树
Head *creat_tree();
//插入结点
int Insert_btree(Head *tree, char data, int pos, int count, int flag);
//打印二叉树
void Display (Head* tree);
//结点的删除
int Delete (Head *tree, int pos, int count);
//二叉树的高度
int BTree_Height (Head *);
//二叉树的度
int BTree_Degree (Head *);
//二叉树的清空
int BTree_Clear (Head *);
//二叉树的销毁
int BTree_Destroy (Head **);
//前序遍历
void pre_order (Btree *node);
//中序遍历
void mid_order (Btree *node);
//后序遍历
void last_order (Btree *node);

#endif //__2TREE_H__

//主演代码
#include "2tree.h"
#include <stdlib.h>

Head *creat_tree()
{
	Head *tree = (Head *)malloc(sizeof(Head)/sizeof(char));
	if(tree == NULL)
	{
		return FALSE;
	}
	tree->head  = NULL;
	tree->count = 0;
	
	return tree;
}

int Insert_btree(Head *tree, char data, int pos, int count, int flag)
{
	if(tree == NULL || flag != 0 && flag != 1)
	{
		return FALSE;
	}
	Btree *node = (Btree *)malloc(sizeof(Btree)/sizeof(char));
	if(node == NULL)
	{
		return FALSE;
	}
	node->data   = data;
	node->rchild = NULL;
	node->lchild = NULL;
	
	Btree *parent  = NULL;
	Btree *current = tree->head;
	int way;
	while(count)
	{
		way = pos & 1;
		pos = pos >> 1;
		parent = current;
		
		if(way == 0)
			current = current->lchild;
		else
			current = current->rchild;
		
		count --;
	}
	if(flag == 0)
		node->lchild = current;
	else
		node->rchild = current;
	
	if(parent != NULL)
	{
		if(way == 0)
			parent->lchild = node;
		else
			parent->rchild = node;
	}
	else
		tree->head = node;
	
	tree->count++;
	
	return TRUE	;
}

void r_display(Btree *node,int gap)
{
	int i;
	if(node == NULL)
	{
		for(i = 0; i < gap; i++)
		{
			printf("-");
		}
		printf("\n");
		return;
	}
	
	for(i = 0; i < gap; i++)
	{
		printf("-");
	}
	
	printf("%c\n",node->data);
	
	if(node->lchild != NULL || node->rchild !=NULL)
	{
		r_display(node->lchild, gap + 4);
		r_display(node->rchild, gap + 4);
	}
}

void Display (Head* tree)
{
	if(tree == NULL)
	{
		return;
	}
	r_display(tree->head, 0);
}

void r_delete(Head *tree, Btree *node)
{
	if(node == NULL || tree == NULL)
	{
		return;
	}
	r_delete(tree, node->lchild);
	
	r_delete(tree, node->rchild);
	
	free(node);
	
	tree->count--;
}


int Delete (Head *tree, int pos, int count)
{
	if(tree == NULL)
	{
		return FALSE;
	}
	
	Btree *parent  = NULL;
	Btree *current = tree->head;
	int way = 0;
	
	while(count)
	{
		way = pos & 1;
		pos = pos >> 1;
		parent = current;
		
		if(way == 0)
			current = current->lchild;
		else
			current = current->rchild;
		
		count --;
	}
	if(parent != NULL)
	{
		if(way == 0)
			parent->lchild = NULL;
		else
			parent->rchild = NULL;
	}
	else
		tree->head = NULL;
	
	r_delete(tree,current);
	
	return TRUE;
}

int r_Height(Btree *node)
{
	if(node == NULL)
	{
		return 0;
	}
	int lh = r_Height(node->lchild);
	int rh = r_Height(node->rchild);
	
	return (lh > rh ? lh+1 : rh+1);
}


int BTree_Height (Head *tree)
{
	if(tree == NULL)
	{
		return FALSE;
	}
	int subHeight = r_Height(tree->head);
	
	return subHeight;
}

int r_Degree(Btree *node)
{
	if(node == NULL)
	{
		return 0;
	}
	int degree = 0;
	
	if(node->rchild != NULL)
		degree++;
	if(node->lchild != NULL)
		degree++;
	
	if(degree == 1)
	{
		int rd = r_Degree(node->rchild);
		if(rd == 2)
			return 2;
		
		int ld = r_Degree(node->lchild);
		if(ld == 2)
			return 2;
	}
	
	return degree;
	
}


int BTree_Degree(Head *tree)
{
	if(tree == NULL)
	{
		return FALSE;
	}
	int degree = r_Degree(tree->head);
	
	return degree;
}

int BTree_Clear (Head *tree)
{
	if(tree == NULL)
	{
		return FALSE;
	}
	Delete(tree,0,0);
	
	return TRUE;
}

int BTree_Destroy (Head **tree)
{
	if(tree == NULL)
	{
		return FALSE;
	}
	
	BTree_Clear(*tree);
	free(*tree);
	
	return TRUE;
}

void pre_order (Btree *node)
{
	if(node == NULL)
	{
		return ;
	}
	printf("%4c",node->data);
	pre_order(node->lchild);
	pre_order(node->rchild);
	
}

void mid_order (Btree *node)
{
	if(node == NULL)
	{
		return ;
	}
	mid_order(node->lchild);
	printf("%4c",node->data);
	mid_order(node->rchild);
}

void last_order (Btree *node)
{
	if(node == NULL)
	{
		return ;
	}
	last_order(node->lchild);
	last_order(node->rchild);
	printf("%4c",node->data);

}

//主函数
#include <stdio.h>
#include "2tree.h"

int main()
{
	Head *tree = creat_tree();
	
	Insert_btree(tree, 'A', 0, 0, 0);
	Insert_btree(tree, 'B', 0, 1, 0);
	Insert_btree(tree, 'C', 2, 2, 0);
	Insert_btree(tree, 'D', 2, 3, 0);
	Insert_btree(tree, 'E', 6, 3, 0);
	Insert_btree(tree, 'F', 1, 1, 0);
	Insert_btree(tree, 'G', 3, 2, 0);
	
	Display(tree);
	printf("前序遍历:");
	pre_order (tree->head);
	printf("\n");
	printf("中序遍历:");
	mid_order (tree->head);
	printf("\n");
	printf("后序遍历:");
	last_order(tree->head);
	printf("\n");
	
	printf("高度:%d\n",BTree_Height(tree));
	printf("度 : %d\n",BTree_Degree(tree));
	
	printf("删除结点后:\n");
	Delete(tree, 2, 2);
	Display(tree);
	
	if(BTree_Destroy(&tree))
		printf("销毁成功\n");
	
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值