-
Notifications
You must be signed in to change notification settings - Fork 0
/
bitree.cpp
86 lines (78 loc) · 1.94 KB
/
bitree.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#define _CRT_SECURE_NO_WARNINGS 1
#include "BiTree.h"
// 二叉链表的基本操作
/*创建二叉树*/
Status CreateBiTree(BiTree &T)
{ // 按完全先序序列输入二叉树中结点的值
TElemType Number=0;
scanf("%c",&Number);
if(Number=='0')
T=NULL;//空树
else{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data=Number; // 生成根结点
CreateBiTree(T->Lchild); // 递归建(遍历)左子树
CreateBiTree(T->Rchild); // 递归建(遍历)右子树
}
return OK;
}
/*输出用的函数*/
void visit(TElemType e)
{
printf("[%c]",e);
}
/*先序*/
Status PreOrderTraverse(BiTree T,void(*Visit)(TElemType))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数。
// 操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T!=NULL){
Visit(T->data);
PreOrderTraverse(T->Lchild,visit);
PreOrderTraverse(T->Rchild,visit);
}
return OK;
}
/*中序*/
Status InOrderTraverse(BiTree T,void(*Visit)(TElemType))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
// 操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T!=NULL){
PreOrderTraverse(T->Lchild,visit);
Visit(T->data);
PreOrderTraverse(T->Rchild,visit);
}
return OK;
}
/*后序*/
Status PostOrderTraverse(BiTree T,void(*Visit)(TElemType))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
// 操作结果:后序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T!=NULL){
PreOrderTraverse(T->Lchild,visit);
PreOrderTraverse(T->Rchild,visit);
Visit(T->data);
}
return OK;
}
/*目录状输出*/
Status PrintTree(BiTree bt,int Layer)
{ //按竖向树状打印的二叉树
if(bt!=NULL){
PrintTree(bt->Lchild,Layer+1);
for(int i=0;i<=Layer;i++)
printf("-");
printf("%c\n",bt->data);
PrintTree(bt->Rchild,Layer+1);
}
return OK;
}
/*销毁*/
Status DestroyBiTree(BiTree &T)
{ // 初始条件:二叉树T存在。操作结果:销毁二叉树T
if(T!=NULL){
DestroyBiTree(T->Lchild);
DestroyBiTree(T->Rchild);
free(T);
}
return OK;
}