main.c文件
#include "BTree.h"
#include <stdio.h>
#include "LinkQueue.h"
#include "LinkStack.h"
void printData(BTreeNode* node)
{
printf ("%c\n", node->data);
}
void pre_order(BTreeNode *root)
{
if (root == NULL)
return;
printf ("%4c", root->data);
pre_order (root->lchild);
pre_order (root->rchild);
}
// 非递归方式实现前序遍历
void pre1(BTreeNode *root)
{
if(root == NULL)
return;
LinkStack *stack = CreateStack();
BTreeNode* p = root;
while (p != NULL || !StackEmpty(stack))
{
while(p)
{
printf ("%4c", p->data);
Push(stack, p);
p = p->lchild;
}
if (!StackEmpty(stack))
{
Pop (stack, &p);
p = p->rchild;
}
}
}
void mid_order(BTreeNode *root)
{
if (root == NULL)
return;
mid_order (root->lchild);
printf ("%4c", root->data);
mid_order (root->rchild);
}
// 非递归方式实现中序遍历
void mid1(BTreeNode *root)
{
if(root == NULL)
return;
LinkStack *stack = CreateStack();
BTreeNode* p = root;
while (p != NULL || !StackEmpty(stack))
{
while(p)
{
Push(stack, p);
p = p->lchild;
}
if (!StackEmpty(stack))
{
Pop (stack, &p);
printf ("%4c", p->data);
p = p->rchild;
}
}
}
void last_order(BTreeNode *root)
{
if (root == NULL)
return;
last_order (root->lchild);
last_order (root->rchild);
printf ("%4c", root->data);
}
void level_order(BTreeNode *root)
{
if (root == NULL)
return;
LinkQueue * queue = CreateQueue();
EnQueue (queue, root); // 根节点进队
while (!QueueEmpty(queue))
{
// 队头元素出队
BTreeNode* p = NULL;
DeQueue(queue, &p);
printf ("%4c", p->data);
if (p->lchild != NULL)
EnQueue(queue, p->lchild); // 左节点入队
if (p->rchild != NULL)
EnQueue(queue, p->rchild); // 右节点入队
}
free(queue);
}
int main()
{
BTree * btree = Create_Btree();
if (btree == NULL)
return -1;
printf ("二叉树创建成功\n");
Btree_Insert(btree, 'A', 0, 0, 0);
Btree_Insert(btree, 'B', 0, 1, 0);
Btree_Insert(btree, 'C', 1, 1, 0);
Btree_Insert(btree, 'D', 0, 2, 0);
Btree_Insert(btree, 'E', 2, 2, 0);
Btree_Insert(btree, 'H', 3, 2, 0);
Btree_Insert(btree, 'G', 0, 3, 0);
Btree_Insert(btree, 'F', 6, 3, 0);
DisPlay(btree, printData, 4, '-');
printf ("前序遍历:\n");
pre_order (btree->root);
printf ("\n");
pre1(btree->root);
printf ("\n");
printf ("中序遍历:\n");
mid_order (btree->root);
printf ("\n");
mid1(btree->root);
printf ("\n");
printf ("后序遍历:\n");
last_order (btree->root);
printf ("\n");
printf ("层次遍历:\n");
level_order (btree->root);
printf ("\n");
#if 0
//Delete(btree, 0, 1);
printf ("--------------------------\n");
//DisPlay(btree, printData, 4, '-');
BTreeNode* node = BTree_Get(btree, 0, 1);
printf ("%c\n", node->data);
printf ("height : %d\n", BTree_Height(btree));
printf ("degree : %d\n", BTree_Degree(btree));
BTree_Clear(btree);
DisPlay(btree, printData, 4, '-');
#endif
return 0;
}
LinkQueue.c文件
#include "LinkQueue.h"
#include <stdlib.h>
#include <assert.h>
LinkQueue * CreateQueue()
{
LinkQueue * queue = (LinkQueue*)malloc(sizeof(LinkQueue)/sizeof(char));
assert (queue);
// 置空队
queue->front = NULL;
queue->rear = NULL;
return queue;
}
// 如果空队返回真,非空队返回假
int QueueEmpty (LinkQueue *Q)
{
assert (Q);
return Q->front == NULL;
}
int EnQueue (LinkQueue *Q, QueueData x)
{
assert (Q);
QueueNode * node = (QueueNode*)malloc(sizeof(QueueNode)/sizeof(char));
assert(node);
node->data = x;
node->next = NULL;
if (QueueEmpty(Q))
{
Q->front = node;
Q->rear = node;
}
else
{
Q->rear->next = node;
Q->rear = node;
}
return OK;
}
int DeQueue (LinkQueue *Q, QueueData *x)
{
assert (Q);
if (QueueEmpty(Q))
return ERROR;
QueueNode *p = Q->front;
Q->front = p->next;
*x = p->data;
free(p);
// 空队的状态
if (Q->front == NULL)
Q->rear = NULL;
return OK;
}
int GetFront (LinkQueue *Q, QueueData *x)
{
assert (Q);
if (QueueEmpty(Q))
return ERROR;
*x = Q->front->data;
return OK;
}
Btree.c文件
#include "BTree.h"
#include <stdlib.h>
#include <stdio.h>
BTree * Create_Btree()
{
BTree *tree = (BTree*)malloc(sizeof(BTree)/sizeof(char));
if (tree == NULL)
return NULL;
tree->root = NULL;
tree->count = 0;
return tree;
}
int Btree_Insert(BTree* btree, BTreeData data, int pos, int count, int flag)
{
if (btree == NULL || (flag != BLEFT && flag != BRIGHT))
return -1;
// 新建结点
BTreeNode * node = (BTreeNode*)malloc(sizeof(BTreeNode)/sizeof(char));
if (node == NULL)
return -1;
node->data = data;
node->lchild = NULL;
node->rchild = NULL;
BTreeNode* parent = NULL;
BTreeNode* current = btree->root; // 从根节点开始找
int way = 0;
// 寻找插入的位置
while(count > 0 && current != NULL)
{
// 当前往哪走
way = pos & 1;
pos = pos >> 1;
// 走完了之后当前结点就变成走完之后结点的双亲结点
parent = current;
if (way == BLEFT)
current = current->lchild;
else
current = current->rchild;
count--;
}
// 将插入位置的结点挂到新结点下面
if (flag == BLEFT)
node->lchild = current;
else
node->rchild = current;
// 通过最后一次走的路线判断新节点应该挂在双亲结点的什么位置
if (parent != NULL)
{
if (way == BLEFT)
parent->lchild = node;
else
parent->rchild = node;
}
else
{
btree->root = node; // 如果没有根节点(空树)将当前结点当作根节点
}
btree->count++;
return 0;
}
void r_display(BTreeNode* node, BTree_Print pfunc, int format, int gap, char div)
{
int i;
if (node == NULL)
{
for(i = 0; i < format; i++)
{
printf ("%c", div);
}
printf ("\n");
return;
}
for(i = 0; i < format; i++)
{
printf ("%c", div);
}
pfunc(node);
if (node->lchild != NULL || node->rchild != NULL)
{
// 打印左孩子
r_display(node->lchild, pfunc, format+gap, gap, div);
// 打印右孩子
r_display(node->rchild, pfunc, format+gap, gap, div);
}
}
void DisPlay(BTree* btree, BTree_Print pfunc, int gap, char div)
{
if (btree == NULL)
return;
r_display(btree->root, pfunc, 0, gap, div);
}
void r_delete(BTree* btree, BTreeNode* node)
{
if (node == NULL)
return;
r_delete(btree, node->lchild);
r_delete(btree, node->rchild);
free(node);
node = NULL;
btree->count--;
}
int Delete(BTree* btree, int pos, int count)
{
if (btree == NULL)
return -1;
BTreeNode* parent = NULL;
BTreeNode* current = btree->root;
int way = 0;
while (count > 0 && current != NULL)
{
way = pos & 1;
pos = pos >> 1;
parent = current;
if (way == BLEFT)
current = current->lchild;
else
current = current->rchild;
count--;
}
if (parent != NULL)
{
if (way == BLEFT)
parent->lchild = NULL;
else
parent->rchild = NULL;
}
else
{
btree->root = NULL;
}
r_delete(btree, current);
return 0;
}
BTreeNode* BTree_Get(BTree* tree, int pos, int count)
{
if (tree == NULL)
return NULL;
BTreeNode* parent = NULL;
BTreeNode* current = tree->root;
int way = 0;
while (count > 0 && current != NULL)
{
way = pos & 1;
pos = pos >> 1;
parent = current;
if (way == BLEFT)
current = current->lchild;
else
current = current->rchild;
count--;
}
return current;
}
BTreeNode* BTree_Root(BTree* tree)
{
return tree->root;
}
int r_height(BTreeNode* 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(BTree* tree)
{
if (tree == NULL)
return 0;
r_height(tree->root);
}
int r_degree(BTreeNode* node)
{
if (node == NULL)
return 0;
int ret = 0;
if (node->lchild != NULL)
ret++;
if (node->rchild != NULL)
ret++;
if (ret == 1)
{
int ld = r_degree(node->lchild);
int rd = r_degree(node->rchild);
if (ret < ld)
ret = ld;
if (ret < rd)
ret = rd;
}
return ret;
}
int BTree_Degree(BTree* tree)
{
if (tree == NULL)
return 0;
return r_degree(tree->root);
}
int BTree_Count(BTree* tree)
{
return tree->count;
}
void BTree_Clear(BTree* tree)
{
if (tree == NULL)
return;
Delete(tree, 0, 0); // 删除根节点
tree->root = NULL;
}
void BTree_Destroy(BTree* tree)
{
BTree_Clear(tree);
free(tree);
}
LinkStack.c文件
#include "LinkStack.h"
#include <assert.h>
#include <stdlib.h>
LinkStack * CreateStack()
{
LinkStack* stack = (LinkStack*)malloc(sizeof(LinkStack)/sizeof(char));
if (stack == NULL)
return NULL;
stack->head = NULL; // 空栈
return stack;
}
void InitStack (LinkStack *s)
{
assert(s);
s->head = NULL;
}
// 如果空返回真,否则返回假
int StackEmpty (LinkStack *s)
{
assert (s);
return s->head == NULL;
}
int Push (LinkStack *s, StackData x)
{
assert(s);
StackNode * node = (StackNode*)malloc(sizeof(StackNode)/sizeof(char));
assert(node);
node->data = x;
node->next = s->head;
s->head = node;
return OK;
}
int Pop (LinkStack *s, StackData *x)
{
assert (s);
if (StackEmpty(s))
return ERROR;
StackNode* node = s->head;
s->head = node->next;
*x = node->data;
free(node);
node = NULL;
return OK;
}
int GetTop (LinkStack *s, StackData *x)
{
assert (s);
if (StackEmpty(s))
return ERROR;
StackNode* node = s->head;
*x = node->data;
node = NULL;
return OK;
}
void Destroy(LinkStack *s)
{
assert(s);
StackNode* node = s->head;
StackNode* tmp;
// 将链表的第一个结点当作头节点来使用
while (node != NULL && node->next != NULL)
{
tmp = node->next;
node->next = tmp->next;
free(tmp);
}
// 释放第一个结点(头节点)
free(node);
// 释放栈结点
free(s);
}
Btree.h文件
#ifndef __BTREE_H__
#define __BTREE_H__
#define BLEFT 0
#define BRIGHT 1
// 二叉树数据类型
typedef char BTreeData;
// 二叉树的结点
typedef struct _BtreeNode
{
BTreeData data;
struct _BtreeNode *lchild; // 指向结点的左孩子的指针
struct _BtreeNode *rchild; // 指向结点的右孩子的指针
}BTreeNode;
typedef void (*BTree_Print)(BTreeNode*);
// 二叉树类型
typedef struct _BTree
{
BTreeNode *root; // 指向二叉树的根节点
int count; // 二叉树中结点的个数
}BTree;
BTree * Create_Btree();
// pos 是路线:110(左右右)、101(右左右),count:走的步数
// flag:代表原来的结点要插入到新节点的位置:左或右
int Btree_Insert(BTree* btree, BTreeData data, int pos, int count, int flag);
void DisPlay(BTree* btree, BTree_Print pfunc, int gap, char div);
int Delete(BTree* btree, int pos, int count);
BTreeNode* BTree_Get(BTree* tree, int pos, int count);
BTreeNode* BTree_Root(BTree* tree);
int BTree_Height(BTree* tree);
int BTree_Degree(BTree* tree);
int BTree_Count(BTree* tree);
void BTree_Clear(BTree* tree);
void BTree_Destroy(BTree* tree);
#endif //__BTREE_H__
LinkStack.h文件
#ifndef __LINKSTACK_H__
#define __LINKSTACK_H__
#include "BTree.h"
#define OK 0
#define ERROR -1
typedef BTreeNode* StackData;
typedef struct _StackNode
{
StackData data;
struct _StackNode *next;
}StackNode;
typedef struct _LinkStack
{
StackNode *head;
}LinkStack;
LinkStack * CreateStack();
// 置空栈
void InitStack (LinkStack *S);
// 判栈空否
int StackEmpty (LinkStack *S);
// 进栈
int Push (LinkStack *s, StackData x);
// 出栈
int Pop (LinkStack *S, StackData *x);
// 取栈顶
int GetTop (LinkStack *S, StackData *x);
void Destroy(LinkStack *s);
#endif // __LINKSTACK_H__
LinQueue.h文件
#ifndef __LINKQUEUE_H__
#define __LINKQUEUE_H__
#include "BTree.h"
#define OK 0
#define ERROR -1
typedef BTreeNode* QueueData;
typedef struct _QueueNode
{
QueueData data;
struct _QueueNode *next;
}QueueNode;
typedef struct _LinkQueue
{
QueueNode * front; // 指向队头的指针
QueueNode * rear; // 指向队尾的指针
}LinkQueue;
LinkQueue * CreateQueue();
// 判队空否
int QueueEmpty (LinkQueue *Q);
// 进队
int EnQueue (LinkQueue *Q, QueueData x);
// 出队
int DeQueue (LinkQueue *Q, QueueData *x);
#endif // __LINKQUEUE_H__