0%

二叉树以及链式二叉树的常见操作

二叉树是树这部分中最重要的知识之一,今天看完了郝斌老师关于树部分的知识,并对老师在看上所说的链式二叉树代码进行了实现


一、二叉树的中的一些专有名词的解释:

1.先序遍历:指先访问根节点,再先序遍历左子树,再先序遍历右子树

2.中序遍历:指先中序遍历左子树,再访问根节点,再中序遍历右子树

3.后序遍历:指先后序遍历左子树,再后序遍历右子树,再访问根节点


下面是郝斌老师上课时关于这三种遍历的视频截图

先序遍历:

这里写图片描述
这里写图片描述

中序遍历:

这里写图片描述
这里写图片描述

后序遍历:

这里写图片描述
这里写图片描述



二、通过先序与中序求后序以及通过中序与后序求先序

不论是先序还是后序,我们分别可以从先序的第一个以及后序的最后一个来确认二叉树的根节点,然后通过中序可得出该二叉树的左子树部分由哪些组成,以及右子树部分由哪些组成。

1.在先序与中序求后序时,先序中谁先出现,谁就是子树的根节点

2.在中序与后序求后序时,后序中谁后出现,谁就是子树的根节点


下面是郝斌老师关于求二叉树时的视频截图:

已知先序中序求后序

这里写图片描述

这里写图片描述

已知中序后序求先序

这里写图片描述



三、链式二叉树的常见操作

链式二叉树是常见二叉树的程序实现方法,根据郝斌老师的课程,我对他上课所敲的代码进行了实现,具体代码如下:
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
该二叉树的树状图如下:
A
* *
B C
*
D
*
E

*/


//程序实现代码
#include <stdio.h>
#include <stdlib.h>

typedef struct BTNode{
char data;
struct BTNode * pLeft;
struct BTNode * pRight;
}BTNode;

struct BTNode * createBTree(void);//创建二叉树
void PreTraverseBTree(struct BTNode * pT);//前序遍历
void InTraverseBTree(struct BTNode * pT);//中序遍历
void PostTraverseBTree(struct BTNode * pT);//后序遍历

int main(){
struct BTNode * pT = createBTree();

printf("该二叉树的前序遍历为:\n");
PreTraverseBTree(pT);

printf("\n该二叉树的中序遍历为:\n");

printf("\n该二叉树的后序遍历为:\n");
PostTraverseBTree(pT);

printf("\n");
return 0;
}

struct BTNode * createBTree(){
BTNode * pA = (struct BTNode*)malloc(sizeof(BTNode));
BTNode * pB = (struct BTNode*)malloc(sizeof(BTNode));
BTNode * pC = (struct BTNode*)malloc(sizeof(BTNode));
BTNode * pD = (struct BTNode*)malloc(sizeof(BTNode));
BTNode * pE = (struct BTNode*)malloc(sizeof(BTNode));

//给树的每个节点添加数据
pA->data = 'A';
pB->data = 'B';
pC->data = 'C';
pD->data = 'D';
pE->data = 'E';

//给树的相关节点通过指针连接
pA->pLeft = pB;
pA->pRight = pC;
pB->pLeft = pB->pRight = NULL;
pC->pLeft = pD;
pC->pRight = NULL;
pD->pLeft = NULL;
pD->pRight = pE;
pE->pLeft = pE->pRight = NULL;

return pA;
}

void PreTraverseBTree(struct BTNode * pT){
if(pT != NULL){
printf("%c ",pT->data);
if(pT->pLeft != NULL){
PreTraverseBTree(pT->pLeft);
}
if(pT->pRight != NULL){
PreTraverseBTree(pT->pRight);
}
}
}

void InTraverseBTree(struct BTNode * pT){
if(pT != NULL){
if(pT->pLeft != NULL){
InTraverseBTree(pT->pLeft);
}
printf("%c ",pT->data);
if(pT->pRight != NULL){
InTraverseBTree(pT->pRight);
}
}
}

void PostTraverseBTree(struct BTNode * pT){
if(pT != NULL){
if(pT->pLeft != NULL){
PostTraverseBTree(pT->pLeft);
}
if(pT->pRight != NULL){
PostTraverseBTree(pT->pRight);
}
printf("%c ",pT->data);
}
}