数据结构---二叉树

记录一下二叉树的相关代码,方便回忆,基础知识不做介绍。

binarytree.c

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


typedef struct _treeNode {
	int data;
	struct _treeNode *lchild;
	struct _treeNode *rchild;
}treeNode_t;


void treeCreate(treeNode_t **root)
{
	printf("please input node value, [0] to over :");
	int dat = 0;
	scanf("%d", &dat);

	if(dat == 0) {
		*root = NULL;
	} else {
		*root = (treeNode_t *)malloc(sizeof(treeNode_t));
		if(*root == NULL) {
			return ;
		}
		(*root)->data = dat;
		printf("%d's lchild ", (*root)->data);
		treeCreate(&((*root)->lchild));
		printf("%d's rchild ", (*root)->data);
		treeCreate(&((*root)->rchild));
	}

	return ;
}


void treeDestory(treeNode_t *root)
{
	if(root == NULL) {
		return ;
	}
	treeDestory(root->lchild);
	treeDestory(root->rchild);
	free(root);
}

//前序遍历
void treePreorder(treeNode_t *root)
{
	if(root == NULL) {
		return ;
	}

	printf(" %d ", root->data);
	treePreorder(root->lchild);
	treePreorder(root->rchild);
}

//中序遍历
void treeInorder(treeNode_t *root)
{
	if(root == NULL) {
		return ;
	}

	treeInorder(root->lchild);
	printf(" %d ", root->data);
	treeInorder(root->rchild);
}

//后序遍历
void treeEndorder(treeNode_t *root)
{
	if(root == NULL) {
		return ;
	}

	treeEndorder(root->lchild);
	treeEndorder(root->rchild);
	printf(" %d ", root->data);
}
//层序遍历
void treeLevelorder(treeNode_t *root)
{
	if(root == NULL) {
		return ;
	}

	treeNode_t *node = NULL;
	listQueue_t *queue = NULL;
	queue = queue_create();

	queue_entry(queue, (void *)root);
	while(!queueIsEmpty(queue)) {
		queue_pop(queue, (void **)&node);
		printf(" %d ", node->data);

		if(node->lchild != NULL) {
			queue_entry(queue, (void *)node->lchild);
		}
		if(node->rchild != NULL) {
			queue_entry(queue, (void *)node->rchild);
		}
	}
	return ;
}

//打印叶子结点
void treePrintLeaf(treeNode_t *root)
{
	if(root == NULL) {
		return ;
	}

	if(root->lchild == NULL && root->rchild == NULL) {
		printf(" %d ", root->data);
	}
	treePrintLeaf(root->lchild);
	treePrintLeaf(root->rchild);
}

//打印叶子结点个数
int treePrintLeafNum(treeNode_t *root)
{
	if(root == NULL) {
		return 0;
	}

	if((root->lchild == NULL) && (root->rchild == NULL)) {
		return 1;
	}
	return treePrintLeafNum(root->lchild) + treePrintLeafNum(root->rchild);
}

//打印树的深度
int treePrintTreeDepth(treeNode_t *root)
{
	if(root == NULL) {
		return 0;
	}

	int ldepth = 0;
	int rdepth = 0;
	ldepth = treePrintTreeDepth(root->lchild);
	rdepth = treePrintTreeDepth(root->rchild);

	return ((ldepth > rdepth)? (ldepth+1) :(rdepth+1));
}


int main(void)
{
	treeNode_t *root;
	treeCreate(&root);
	printf("\n前序遍历:");
	treePreorder(root);
	printf("\n中序遍历:");
	treeInorder(root);
	printf("\n后序遍历:");
	treeEndorder(root);
	printf("\n层序遍历:");
	treeLevelorder(root);
	printf("\n叶子节点:");
	treePrintLeaf(root);
	printf("\n叶子节点个数:%d", treePrintLeafNum(root));
	printf("\n树的深度:%d", treePrintTreeDepth(root));
	printf("\n");

	return 0;
}

queue.h

#ifndef QUEUE_H_
#define QUEUE_H_


typedef struct _queueNode{
	void *data;
	struct _queueNode *next;
}queueNode_t;

typedef struct _listQueue {
	int num;
	queueNode_t *head;
	queueNode_t *tail;
}listQueue_t;

#define queueIsEmpty(queue) (queue->num == 0)
listQueue_t *queue_create(void);
void queue_entry(listQueue_t *queue ,void *data);
void queue_pop(listQueue_t *queue, void **data);
#endif

queue.c

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


listQueue_t *queue_create(void)
{
	listQueue_t *queue = NULL;
	queue = (listQueue_t *)malloc(sizeof(listQueue_t));
	if(queue == NULL) {
		return NULL;
	}

	queue->num = 0;
	queue->head = NULL;
	queue->tail = NULL;
	return queue;
}

void queue_entry(listQueue_t *queue ,void *data)
{
	if(queue == NULL || data == NULL) {
		return ;
	}

	queueNode_t *ptmp = (queueNode_t *)malloc(sizeof(queueNode_t));
	if(ptmp == NULL) {
		return ;
	}

	ptmp->data = data;
	ptmp->next = NULL;
	if(queue->head == NULL) {
		queue->head = ptmp;
	} else {
		queue->tail->next = ptmp;
	}
	queue->tail = ptmp;

	queue->num++;
	return;
}

void queue_pop(listQueue_t *queue, void **data)
{
	if(queue == NULL || data == NULL || queueIsEmpty(queue)) {
		return ;
	}
	queueNode_t *ptmp = NULL;

	*data = queue->head->data;
	ptmp = queue->head;
	queue->head = queue->head->next;
	queue->num--;
	if(queue->head == NULL) {
		queue->tail = NULL;
	}

	free(ptmp);
	return ;
}

这里层序遍历需要用到队列,C语言得手搓队列,记录一下。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值