二叉树的基本操作
在二叉树的层序遍历中使用到了队列的基本操作
BiTree.h
#ifndef __BITREE_H__
#define __BITREE_H__
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include "queue.h"
#include "stack.h"
#define TRUE 1
#define FALSE 0
typedef int status;
typedef struct BiTNode
{
int data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTree;
#endif
BiTree.c
#include "BiTree.h"
//创建二叉树
status CreateBiTree(BiTree *root)
{
BiTree *pmove;
int a, b;
pmove = root;
if(pmove == NULL)
{
return TRUE;
}
printf("输入左右子树:");
scanf("%d %d", &a, &b);
printf("%d %d\n", a, b);
if(a != 0)
{
printf("创建左孩子:%d\n", a);
pmove->lchild = (BiTree *)malloc(sizeof(BiTree));
pmove->lchild->data = a;
}
else
{
pmove->lchild = NULL;
}
if(b != 0)
{
printf("创建右孩子:%d\n", b);
pmove->rchild = (BiTree *)malloc(sizeof(BiTree));
pmove->rchild->data = b;
}
else
{
pmove->rchild = NULL;
}
CreateBiTree(pmove->lchild);
CreateBiTree(pmove->rchild);
return TRUE;
}
//清除二叉树
status ClearBiTree(BiTree *root)
{
if(root == NULL)
{
return TRUE;
}
ClearBiTree(root->lchild);
ClearBiTree(root->rchild);
free(root);
}
void VisitNode(BiTree *T)
{
printf("%d ", T->data);
}
//先序遍历
status PreOrderTraverse(BiTree *T, void (*visit)(BiTree *T))
{
if(T == NULL)
{
return TRUE;
}
visit(T);
PreOrderTraverse(T->lchild, visit);
PreOrderTraverse(T->rchild, visit);
return TRUE;
}
//中序遍历
status InOrderTraverse(BiTree *T, void (*visit)(BiTree *T))
{
if(T == NULL)
{
return TRUE;
}
InOrderTraverse(T->lchild, visit);
visit(T);
InOrderTraverse(T->rchild, visit);
return TRUE;
}
//后序遍历
status PostOrderTraverse(BiTree *T, void (*visit)(BiTree *T))
{
if(T == NULL)
{
return TRUE;
}
PostOrderTraverse(T->lchild, visit);
PostOrderTraverse(T->rchild, visit);
visit(T);
return TRUE;
}
//层序遍历,借助队列实现
status LevelOrderTraverse(BiTree *T, void (*visit)(BiTree *T))
{
queue s;
BiTree *pmove;
if(T == NULL)
{
return TRUE;
}
initqueue(&s);
enqueue(&s, T);
while(!IsEmptyQueue(&s))
{
dequeue(&s, &pmove);
if(pmove != NULL)
{
visit(pmove);
enqueue(&s, pmove->lchild);
enqueue(&s, pmove->rchild);
}
}
return TRUE;
}
//逆转二叉树
status ReverseBiTree(BiTree *T)
{
BiTree *pt;
if(T == NULL)
{
return TRUE;
}
pt = T->lchild;
T->lchild = T->rchild;
T->rchild = pt;
ReverseBiTree(T->lchild);
ReverseBiTree(T->rchild);
return TRUE;
}
//复制二叉树
status DulpBiTree(BiTree **dst, BiTree *src)
{
if(src == NULL)
{
*dst = NULL;
}
else
{
*dst = (BiTree *)malloc(sizeof(BiTree));
(*dst)->data = src->data;
DulpBiTree(&(*dst)->lchild, src->lchild);
DulpBiTree(&(*dst)->rchild, src->rchild);
}
return TRUE;
}
//对比两个二叉树是不否相似
status similitude(BiTree *T1, BiTree *T2)
{
if(T1 == NULL && T2 == NULL)
{
return TRUE;
}
if(T1 != NULL && T2 != NULL)
{
if(similitude(T1->lchild, T2->lchild) && similitude(T1->rchild, T2->rchild))
{
return TRUE;
}
}
return FALSE;
}
测试代码:
int main()
{
BiTree *root = (BiTree *)malloc(sizeof(BiTree));
BiTree *r2;
root->data = 0;
freopen("1.txt", "r", stdin);
CreateBiTree(root);
printf("先序遍历:");
PreOrderTraverse(root, VisitNode);
printf("\n");
printf("中序遍历:");
InOrderTraverse(root, VisitNode);
printf("\n");
printf("后序遍历:");
PostOrderTraverse(root, VisitNode);
printf("\n");
printf("层序遍历:");
LevelOrderTraverse(root, VisitNode);
printf("\n");
ReverseBiTree(root);
printf("层序遍历:");
LevelOrderTraverse(root, VisitNode);
printf("\n");
DulpBiTree(&r2, root);
printf("层序遍历:");
LevelOrderTraverse(r2, VisitNode);
printf("\n");
ReverseBiTree(r2);
printf("%d\n", similitude(r2, root));
ClearBiTree(r2);
ClearBiTree(root);
}