数据结构二叉树遍历实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 #include

#include

#include

#define ElemType char

struct BTreeNode {

ElemType data;

struct BTreeNode* left;

struct BTreeNode* right;

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 void CreateBTree(struct BTreeNode** T)

{

char ch;

scanf_s("\n%c", &ch);

if (ch == '#') *T = NULL;

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);

}

}

void Postorder(struct BTreeNode* T)

{

if (T != NULL) {

Postorder(T->left);

Postorder(T->right);

printf("%c ", T->data);

}

}

void Levelorder(struct BTreeNode* BT)

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

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);

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);

printf("前序序列:\n");

Preorder(T);

printf("\n");

printf("中序序列:\n");

相关文档
最新文档