2019-06-04 23:18:46 +08:00
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
2018-02-16 23:58:28 +08:00
|
|
|
|
|
|
|
|
|
#define TRUE 1
|
|
|
|
|
#define FALSE 0
|
|
|
|
|
#define OK 1
|
|
|
|
|
#define ERROR 0
|
|
|
|
|
#define OVERFLOW -1
|
|
|
|
|
#define SUCCESS 1
|
|
|
|
|
#define UNSUCCESS 0
|
|
|
|
|
#define dataNum 5
|
|
|
|
|
int i = 0;
|
|
|
|
|
int dep = 0;
|
|
|
|
|
char data[dataNum] = { 'A', 'B', 'C', 'D', 'E' };
|
|
|
|
|
|
|
|
|
|
typedef int Status;
|
|
|
|
|
typedef char TElemType;
|
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
// 二叉树结构
|
2018-02-16 23:58:28 +08:00
|
|
|
|
typedef struct BiTNode
|
|
|
|
|
{
|
2019-06-04 23:18:46 +08:00
|
|
|
|
TElemType data;
|
|
|
|
|
struct BiTNode *lchild, *rchild;
|
2018-02-16 23:58:28 +08:00
|
|
|
|
}BiTNode, *BiTree;
|
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
// 初始化一个空树
|
2018-02-16 23:58:28 +08:00
|
|
|
|
void InitBiTree(BiTree &T)
|
|
|
|
|
{
|
2019-06-04 23:18:46 +08:00
|
|
|
|
T = NULL;
|
2018-02-16 23:58:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
// 构建二叉树
|
2018-02-16 23:58:28 +08:00
|
|
|
|
BiTree MakeBiTree(TElemType e, BiTree L, BiTree R)
|
|
|
|
|
{
|
2019-06-04 23:18:46 +08:00
|
|
|
|
BiTree t;
|
|
|
|
|
t = (BiTree)malloc(sizeof(BiTNode));
|
|
|
|
|
if (NULL == t) return NULL;
|
|
|
|
|
t->data = e;
|
|
|
|
|
t->lchild = L;
|
|
|
|
|
t->rchild = R;
|
|
|
|
|
return t;
|
2018-02-16 23:58:28 +08:00
|
|
|
|
}
|
2019-06-04 23:18:46 +08:00
|
|
|
|
|
|
|
|
|
// 访问结点
|
2018-02-16 23:58:28 +08:00
|
|
|
|
Status visit(TElemType e)
|
|
|
|
|
{
|
2019-06-04 23:18:46 +08:00
|
|
|
|
printf("%c", e);
|
|
|
|
|
return OK;
|
2018-02-16 23:58:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
// 对二叉树T求叶子结点数目
|
|
|
|
|
int Leaves(BiTree T)
|
2018-02-16 23:58:28 +08:00
|
|
|
|
{
|
2019-06-04 23:18:46 +08:00
|
|
|
|
int l = 0, r = 0;
|
|
|
|
|
if (NULL == T) return 0;
|
|
|
|
|
if (NULL == T->lchild && NULL == T->rchild) return 1;
|
|
|
|
|
|
|
|
|
|
// 求左子树叶子数目
|
|
|
|
|
l = Leaves(T->lchild);
|
|
|
|
|
// 求右子树叶子数目
|
|
|
|
|
r = Leaves(T->rchild);
|
|
|
|
|
// 组合
|
|
|
|
|
return r + l;
|
2018-02-16 23:58:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
// 层次遍历:dep是个全局变量,高度
|
|
|
|
|
int depTraverse(BiTree T)
|
2018-02-16 23:58:28 +08:00
|
|
|
|
{
|
2019-06-04 23:18:46 +08:00
|
|
|
|
if (NULL == T) return ERROR;
|
2018-02-16 23:58:28 +08:00
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
dep = (depTraverse(T->lchild) > depTraverse(T->rchild)) ? depTraverse(T->lchild) : depTraverse(T->rchild);
|
2018-02-16 23:58:28 +08:00
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
return dep + 1;
|
2018-02-16 23:58:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
// 高度遍历:lev是局部变量,层次
|
|
|
|
|
void levTraverse(BiTree T, Status(*visit)(TElemType e), int lev)
|
2018-02-16 23:58:28 +08:00
|
|
|
|
{
|
2019-06-04 23:18:46 +08:00
|
|
|
|
if (NULL == T) return;
|
|
|
|
|
visit(T->data);
|
|
|
|
|
printf("的层次是%d\n", lev);
|
2018-02-16 23:58:28 +08:00
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
levTraverse(T->lchild, visit, ++lev);
|
|
|
|
|
levTraverse(T->rchild, visit, lev);
|
2018-02-16 23:58:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
// num是个全局变量
|
|
|
|
|
void InOrderTraverse(BiTree T, Status(*visit)(TElemType e), int &num)
|
2018-02-16 23:58:28 +08:00
|
|
|
|
{
|
2019-06-04 23:18:46 +08:00
|
|
|
|
if (NULL == T) return;
|
|
|
|
|
visit(T->data);
|
|
|
|
|
if (NULL == T->lchild && NULL == T->rchild) { printf("是叶子结点"); num++; }
|
|
|
|
|
else printf("不是叶子结点");
|
|
|
|
|
printf("\n");
|
|
|
|
|
InOrderTraverse(T->lchild, visit, num);
|
|
|
|
|
InOrderTraverse(T->rchild, visit, num);
|
2018-02-16 23:58:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
// 二叉树判空
|
2018-02-16 23:58:28 +08:00
|
|
|
|
Status BiTreeEmpty(BiTree T)
|
|
|
|
|
{
|
2019-06-04 23:18:46 +08:00
|
|
|
|
if (NULL == T) return TRUE;
|
|
|
|
|
return FALSE;
|
2018-02-16 23:58:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
// 打断二叉树:置空二叉树的左右子树
|
2018-02-16 23:58:28 +08:00
|
|
|
|
Status BreakBiTree(BiTree &T, BiTree &L, BiTree &R)
|
|
|
|
|
{
|
2019-06-04 23:18:46 +08:00
|
|
|
|
if (NULL == T) return ERROR;
|
|
|
|
|
L = T->lchild;
|
|
|
|
|
R = T->rchild;
|
|
|
|
|
T->lchild = NULL;
|
|
|
|
|
T->rchild = NULL;
|
|
|
|
|
return OK;
|
2018-02-16 23:58:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
// 替换左子树
|
2018-02-16 23:58:28 +08:00
|
|
|
|
Status ReplaceLeft(BiTree &T, BiTree <)
|
|
|
|
|
{
|
2019-06-04 23:18:46 +08:00
|
|
|
|
BiTree temp;
|
|
|
|
|
if (NULL == T) return ERROR;
|
|
|
|
|
temp = T->lchild;
|
|
|
|
|
T->lchild = LT;
|
|
|
|
|
LT = temp;
|
|
|
|
|
return OK;
|
2018-02-16 23:58:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
// 替换右子树
|
2018-02-16 23:58:28 +08:00
|
|
|
|
Status ReplaceRight(BiTree &T, BiTree &RT)
|
|
|
|
|
{
|
2019-06-04 23:18:46 +08:00
|
|
|
|
BiTree temp;
|
|
|
|
|
if (NULL == T) return ERROR;
|
|
|
|
|
temp = T->rchild;
|
|
|
|
|
T->rchild = RT;
|
|
|
|
|
RT = temp;
|
|
|
|
|
return OK;
|
2018-02-16 23:58:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
// 合并二叉树
|
2018-02-16 23:58:28 +08:00
|
|
|
|
void UnionBiTree(BiTree &Ttemp)
|
|
|
|
|
{
|
2019-06-04 23:18:46 +08:00
|
|
|
|
BiTree L = NULL, R = NULL;
|
|
|
|
|
L = MakeBiTree(data[i++], NULL, NULL);
|
|
|
|
|
R = MakeBiTree(data[i++], NULL, NULL);
|
|
|
|
|
ReplaceLeft(Ttemp, L);
|
|
|
|
|
ReplaceRight(Ttemp, R);
|
2018-02-16 23:58:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main()
|
|
|
|
|
{
|
2019-06-04 23:18:46 +08:00
|
|
|
|
BiTree T = NULL, Ttemp = NULL;
|
2018-02-16 23:58:28 +08:00
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
InitBiTree(T);
|
|
|
|
|
if (TRUE == BiTreeEmpty(T)) printf("初始化T为空\n");
|
|
|
|
|
else printf("初始化T不为空\n");
|
2018-02-16 23:58:28 +08:00
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
T = MakeBiTree(data[i++], NULL, NULL);
|
2018-02-16 23:58:28 +08:00
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
Ttemp = T;
|
|
|
|
|
UnionBiTree(Ttemp);
|
2018-02-16 23:58:28 +08:00
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
Ttemp = T->lchild;
|
|
|
|
|
UnionBiTree(Ttemp);
|
2018-02-16 23:58:28 +08:00
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
Status(*visit1)(TElemType);
|
|
|
|
|
visit1 = visit;
|
|
|
|
|
int num = 0;
|
|
|
|
|
InOrderTraverse(T, visit1, num);
|
|
|
|
|
printf("叶子结点是 %d\n", num);
|
2018-02-16 23:58:28 +08:00
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
printf("叶子结点是 %d\n", Leaves(T));
|
2018-02-16 23:58:28 +08:00
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
int lev = 1;
|
|
|
|
|
levTraverse(T, visit1, lev);
|
2018-02-16 23:58:28 +08:00
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
printf("高度是 %d\n", depTraverse(T));
|
2018-02-16 23:58:28 +08:00
|
|
|
|
|
2019-06-04 23:18:46 +08:00
|
|
|
|
getchar();
|
|
|
|
|
return 0;
|
2018-02-16 23:58:28 +08:00
|
|
|
|
}
|