数据结构二叉树遍历实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题一:二叉树遍历
1.问题描述
设输入该二叉树的前序序列为:
ABC##DE#G##F##HI##J#K##(#代表空子树)
请编程完成下列任务:
⑴请根据此输入来建立该二叉树,并输出该二叉树的前序、中序和后序序列;
⑵按层次遍历的方法来输出该二叉树按层次遍历的序列;
⑶求该二叉树的高度。
2.设计描述
(1)二叉树是一种树形结构,遍历就是要让树中的所有节点被且仅被访问一次,即按一定规律排列成一个线性队列。二叉(子)树是一种递归定义的结构,包含三个部分:根结点(N)、左子树(L)、右子树(R)。根据这三个部分的访问次序对二叉树的遍历进行分类,总共有6种遍历方案:NLR、LNR、LRN、NRL、RNL和LNR。研究二叉树的遍历就是研究这6种具体的遍历方案,显然根据简单的对称性,左子树和右子树的遍历可互换,即NLR与NRL、LNR与RNL、LRN 与RLN,分别相类似,因而只需研究NLR、LNR和LRN三种即可,分别称为“先序遍历”、“中序遍历”和“后序遍历”。采用递归方式就可以容易的实现二叉树的遍历,算法简单且直观。
(2)此外,二叉树的层次遍历即按照二叉树的层次结构进行遍历,按照从上到下,同一层从左到右的次序访问各节点。遍历算法可以利用队列来实现,开始时将整个树的根节点入队,然后每从队列中删除一个节点并输出该节点的值时,都将它的非空的左右子树入队,当队列结束时算法结束。
(3)计算二叉树高度也是利用递归来实现:若一颗二叉树为空,则它的深度为0,否则深度等于左右子树的最大深度加一。
3.源程序
1 2 3 4 5 6 7 8 9
10
11
12
13
14 #include
#include
#include
#define ElemType char
struct BTreeNode {
ElemType data;
struct BTreeNode* left;
struct BTreeNode* right;
};
void CreateBTree(struct BTreeNode** T) {
char ch;
scanf_s("\n%c", &ch);
if (ch == '#') *T = NULL;
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
else {
(*T) = malloc(sizeof(struct BTreeNode));
(*T)->data = ch;
CreateBTree(&((*T)->left));
CreateBTree(&((*T)->right));
}
}
void Preorder(struct BTreeNode* T)
{
if (T != NULL) {
printf("%c ", T->data);
Preorder(T->left);
Preorder(T->right);
}
}
void Inorder(struct BTreeNode* T)
{
if (T != NULL) {
Inorder(T->left);
printf("%c ", T->data);
Inorder(T->right);
}
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 }
void Postorder(struct BTreeNode* T) {
if (T != NULL) {
Postorder(T->left);
Postorder(T->right);
printf("%c ", T->data);
}
}
void Levelorder(struct BTreeNode* BT) {
struct BTreeNode* p;
struct BTreeNode* q[30];
int front=0,rear=0;
if(BT!=NULL) {
rear=(rear+1)% 30;
q[rear]=BT;
}
while(front!=rear) {
front=(front+1)% 30;
p=q[front];
printf("%c ",p->data);
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
if(p->left!=NULL) {
rear=(rear+1)% 30;
q[rear]=p->left;
}
if(p->right!=NULL) {
rear=(rear+1)% 30;
q[rear]=p->right;
}
}
}
int getHeight(struct BTreeNode* T) {
int lh,rh;
if (T == NULL) return 0;
lh = getHeight(T->left);
rh = getHeight(T->right);
return lh>rh ? lh + 1 : rh + 1; }
void main(void)
{
struct BTreeNode* T;
CreateBTree(&T);