二叉树链式存储的实现

//filename:bitree.h

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

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define NIL '#'	//定义'#'为空节点

typedef struct queue_node qnode;
typedef struct bitree_node bitree;

struct bitree_node
{
	char elem;
	bitree *lchild;
	bitree *rchild;
};

/*队列节点*/
struct queue_node
{
	bitree *btn;
	qnode *next;
};

typedef struct link_queue
{
	qnode *head;
	qnode *tail;
}queue;


/*****队列的基本操作******/
int init_link_queue(queue *Q);
int is_queue_empty(queue Q);
int enqueue(queue *Q, bitree *btn);
int dequeue(queue *Q, char *elem);


/*****二叉树的操作*****/
bitree *create_bitree();
int is_bitree_empty(bitree *btn);
int get_bitree_depth(bitree *btn);
bitree *get_parent(bitree *btn, char elem);
int preorder_traverse(bitree *btn, int (*visit)(char));
int inorder_traverse(bitree *btn, int (*visit)(char));
int postorder_traverse(bitree *btn, int (*visit)(char));
int levelorder_traverse(bitree *btn, int (*visit)(char));
int destory_bitree(bitree *btn);
int print_elem(char elem);



//filename:queue.c

#include "bitree.h"

/* 
功能:链队列初始化 
*/
int init_link_queue(queue *Q)
{
	qnode *tmp_node = (qnode *)malloc(sizeof(qnode));
	if(!tmp_node)
	{
		return ERROR;
	}

	tmp_node->btn = NULL;
	tmp_node->next = NULL;
	Q->head = tmp_node;
	Q->tail = tmp_node;

	return OK;
}

/*
功能:队列是否为空 
返回:1 空;0 非空 
*/
int is_queue_empty(queue Q)
{
	return ((Q.head == Q.tail) ? TRUE : FALSE);
}

/* 
功能:元素num入队
*/
int enqueue(queue *Q, bitree *btn)
{
	qnode *tmp_node = (qnode *)malloc(sizeof(qnode));
	if(!tmp_node)
	{
		return ERROR;
	}

	tmp_node->next = NULL;
	tmp_node->btn = btn;
	Q->tail->next = tmp_node;
	Q->tail = tmp_node;

	return OK;
}


/* 
功能:出队,队头元素存入num
参数:	Q	队列; 
		btn_addr 存放出队节点内的bitree *地址
*/
int dequeue(queue *Q, int *btn_addr)
{
	qnode *tmp_node = NULL;
	if(is_queue_empty(*Q))
	{
		return ERROR;
	}

	tmp_node = Q->head->next;
	Q->head->next = tmp_node->next;
	*btn_addr = tmp_node->btn;

	if(Q->head->next == NULL)
	{
		Q->tail = Q->head;
	}

	free(tmp_node);

	return OK;
}

//filename:bitree.c

#include "bitree.h"

/*
功能:先序创建二叉树
返回:创建的节点地址
*/
bitree *create_bitree()
{
	char elem;
	bitree *btn = NULL;

	fflush(stdin);	//清空输入缓冲流
	scanf("%c", &elem);
	if(elem == NIL)
	{
		return btn;
	}
	else
	{
		btn = (bitree *)malloc(sizeof(bitree));
		btn->elem = elem;

		btn->lchild = create_bitree();
		btn->rchild = create_bitree();

		return btn;
	}
}

/*
功能:判断该二叉树是否为空
返回:1 空; 0 非空
*/
int is_bitree_empty(bitree *btn)
{
	if(!btn)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}

}

/*
功能:求二叉树的深度
*/
int get_bitree_depth(bitree *btn)
{
	int i = 0;	//记录左子树深度
	int j = 0;	//记录右子树深度

	if(!btn)
	{
		return 0;
	}

	if(btn->lchild)
	{
		i = get_bitree_depth(btn->lchild);
	}
	else
	{
		i = 0;
	}

	if(btn->rchild)
	{
		j = get_bitree_depth(btn->rchild);
	}
	else
	{

		j = 0;
	}

	return (i > j) ? (i + 1) : (j + 1);
}

/*
功能:获取元素elem节点的父结点
返回:如果elem为根,返回NULL;
*/
bitree *get_parent(bitree *btn, char elem)
{
	int btn_addr = 0;
	bitree *father_node = NULL;
	queue Q;

	if(!btn)		//树为空
	{
		return NULL;
	}

	init_link_queue(&Q);	//初始化队列
	enqueue(&Q, btn);

	while(!is_queue_empty(Q))	//队列不为空
	{
		dequeue(&Q, &btn_addr);
		father_node = btn_addr;
		if((father_node->lchild && father_node->lchild->elem == elem) ||
			(father_node->rchild && father_node->rchild->elem == elem))
		{
			return father_node;
		}
		else
		{
			if(father_node->lchild)
			{
				enqueue(&Q, father_node->lchild);
			}
			if(father_node->rchild)
			{
				enqueue(&Q, father_node->rchild);
			}	
		}
	}

	return NULL;
}

/*
功能:先序遍历二叉树
*/
int preorder_traverse(bitree *btn, int (*visit)(char))
{
	if(!btn)
	{
		return OK;
	}

	visit(btn->elem);
	preorder_traverse(btn->lchild, visit);
	preorder_traverse(btn->rchild, visit);

	return OK;
}

/*
功能:中序遍历二叉树
*/
int inorder_traverse(bitree *btn, int (*visit)(char))
{
	if(!btn)
	{
		return OK;
	}

	inorder_traverse(btn->lchild, visit);
	visit(btn->elem);
	inorder_traverse(btn->rchild, visit);

	return OK;
}

/*
功能:后序遍历二叉树
*/
int postorder_traverse(bitree *btn, int (*visit)(char))
{
	if(!btn)
	{
		return OK;
	}

	postorder_traverse(btn->lchild, visit);
	postorder_traverse(btn->rchild, visit);
	visit(btn->elem);

	return OK;
}

/*
功能:按层序遍历二叉树,借助队列
*/
int levelorder_traverse(bitree *btn, int (*visit)(char))
{
	int btn_addr = 0;		//记录出队的队列节点的(bitree *)的地址
	bitree *bitree_node = NULL;
	queue Q;

	if(!btn)		//树为空
	{
		return NULL;
	}

	init_link_queue(&Q);	//初始化队列
	enqueue(&Q, btn);

	while(!is_queue_empty(Q))	//队列不为空
	{
		dequeue(&Q, &btn_addr);
		bitree_node = btn_addr;

		visit(bitree_node->elem);

		if(bitree_node->lchild)
		{
			enqueue(&Q, bitree_node->lchild);
		}
		if(bitree_node->rchild)
		{
			enqueue(&Q, bitree_node->rchild);
		}

	}

	return NULL;
}

/*
功能:	销毁二叉树
*/
int destory_bitree(bitree *btn)
{
	if(btn)
	{
		if(btn->lchild)
		{
			destory_bitree(btn->lchild);		
		}
		if(btn->rchild)
		{
			destory_bitree(btn->rchild);		
		}

		free(btn);
		btn = NULL;
	}

	return OK;
}

/*
功能:打印传入的参数值
*/
int print_elem(char elem)
{
	printf("%c ", elem);

	return OK;
}

//filename:test_bitree.c

#include "bitree.h"

/*
测试数据:	先序创建树:abd###c##;
先序遍历:	abdc
中序遍历:	dbac
后序遍历:	dbca
*/
int main(int argc, char *argv[])
{
	bitree *tmpnode = NULL;
	bitree *bitree = NULL;
	
	bitree = create_bitree();

	preorder_traverse(bitree, print_elem);
	printf("\n");
	inorder_traverse(bitree, print_elem);
	printf("\n");
	postorder_traverse(bitree, print_elem);
	printf("\n");
	levelorder_traverse(bitree, print_elem);
	printf("\n");

	printf("the depth of the bitree is %d.\n", get_bitree_depth(bitree));

	tmpnode = get_parent(bitree, 'd');
	printf("the 'd' father node is:%c\n", tmpnode->elem);

	destory_bitree(bitree);
	system("pause");

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值