记录一下二叉树的相关代码,方便回忆,基础知识不做介绍。
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语言得手搓队列,记录一下。