当前位置: 首页 > news >正文

嵌入式自学第二十四天


树:有n(n>=0)个结点的有限集合。n = 0时 ,空树。
在任意一个非空树中,
1,有且仅有一个特定的根结点
2,当n>1 时,其余结点可分为m个互不相交的有限集合T1,T2,T3、、、、Tm,其中每一个
集合又是一个树,并且称谓子树。


结点拥有子树的个数称谓结点的度。度为0的结点称谓叶结点。度不为0,称谓分支结点。

树的度数是指,这棵树中,最大的结点的度数,称谓树的度数。
树的深度或高度,从根开始,根为第一层,根的孩子为第二层。

树的存储:顺序结构

链式结构。


二叉树,binary tree
n个结点的有限集合,集合要么为空树,要么由一个根结点和两棵互不相交,分别称谓根结点的左子树和右子树的二叉树组成。。

特点,
1,每个结点最多两个子树。
2,左子树和右子树是有顺序的,次序不能颠倒。
3,如果某个结点只有一个子树,也要区分左,右子树。

特殊的二叉树
1,斜树,所有的结点都只有左子树,左斜树,所有结点都只有右子树,右树。
2,满二叉树,所有的分支结点都存在左右子树,并且叶子都在同一层上。
3,完全二叉树,对于一颗有n个结点的二叉树按层序编号,如果编号i(1<=i<=n)的结点于同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这可树为完全二叉树。

特性
1,在二叉树的第i层上最多有2^(i-1)个结点 i>=1
2,深度为k的二叉树至多有2^k  -1 个结点 k>=1
3,任意一个二叉树T,如果其叶子结点的个数是n0,度数为2的结点数为n2, n0 = n2 +1;
4,有n个结点的完全二叉树深度为(logn/log 2) +1;

层序,
前序,根左右,先访问根,然访问左,访问右。
中序,左根右,先从根开始(不是先访问根),从左开始访问,在访问根,在访问右结点。
后序,左右根,先从根开始(不是先访问根),先访问左,在访问右。在访问根。

typedef struct BiTNode  /* 结点结构 */
{
   TElemType data; /* 结点数据 */
   struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode,*BiTree;

CreateBiTree();
DestroyBiTree();

PreOrderTraverse();
void InOrderTraverse(BiTree T);
void PostOrderTraverse(BiTree T);

示例:

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

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef char DATATYPE;

typedef struct _tree_node_

{

DATATYPE data;

struct _tree_node_ *left, *right;

} TreeNode;

char data[] = "abd#f###c#eg###";

int ind = 0;

void CreateTree(TreeNode **root)

{

char c = data[ind++];

if ('#' == c)

{

*root = NULL;

return;

}

else

{

*root = malloc(sizeof(TreeNode));

if (NULL == *root)

{

fprintf(stderr, "CreateTree malloc error");

return;

}

(*root)->data = c;

CreateTree(&(*root)->left);

CreateTree(&(*root)->right);

}

}

void PreOrderTraverse(TreeNode *root)

{

if (NULL == root)

{

return;

}

printf("%c", root->data); // root

PreOrderTraverse(root->left); // left

PreOrderTraverse(root->right); // right

}

void InOrderTraverse(TreeNode *root)

{

if (NULL == root)

{

return;

}

InOrderTraverse(root->left); // left

printf("%c", root->data); // root

InOrderTraverse(root->right); // right

}

void PostOrderTraverse(TreeNode *root)

{

if (NULL == root)

{

return;

}

PostOrderTraverse(root->left); // left

PostOrderTraverse(root->right); // right

printf("%c", root->data); // root

}

void DestroyTree(TreeNode *root)

{

if(NULL == root)

{

return ;

}

DestroyTree(root->left);

DestroyTree(root->right);

free(root);

}

int main(int argc, char **argv)

{

TreeNode *root = NULL;

CreateTree(&root);

PreOrderTraverse(root);

puts("");

InOrderTraverse(root);

puts("");

PostOrderTraverse(root);

puts("");

DestroyTree(root);

root = NULL;

// system("pause");

return 0;

}

(散列表查找)哈希表:hash

哈希表查找:

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

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef int DATATYPE;

typedef struct

{

DATATYPE* head;

int tlen;

} HSTable;

HSTable* CreateHsTable(int len)

{

HSTable* hs = malloc(sizeof(HSTable));

if (NULL == hs)

{

fprintf(stderr, "CreateHsTable malloc error");

return NULL;

}

hs->head = malloc(sizeof(DATATYPE) * len);

if (NULL == hs->head)

{

fprintf(stderr, "CreateHsTable malloc2 error");

return NULL;

}

hs->tlen = len;

int i = 0;

for (i = 0; i < len; i++)

{

hs->head[i] = -1;

}

return hs;

}

int HSFun(HSTable* hs, DATATYPE* data) { return *data % hs->tlen; }

int HSInsert(HSTable* hs, DATATYPE* data)

{

int ind = HSFun(hs, data);

while (hs->head[ind] != -1)

{

printf("pos %d, num:%d\n", ind, *data);

ind = (ind + 1) % hs->tlen;

}

hs->head[ind] = *data;

return 0;

}

int HsSearch(HSTable* hs, DATATYPE* data)

{

int ind = HSFun(hs, data);

int old_ind = ind;

while (hs->head[ind] != *data)

{

ind = (ind + 1) % hs->tlen;

if (old_ind == ind)

{

return -1;

}

}

return ind;

}

int main(int argc, char** argv)

{

HSTable* hs = CreateHsTable(12);

int array[] = {12, 67, 56, 16, 25, 37, 22, 29, 15, 47, 48, 34};

int i = 0;

for (i = 0; i < 12; i++)

{

HSInsert(hs, &array[i]);

}

int want_num = 37;

int ret = HsSearch(hs, &want_num);

if (-1 == ret)

{

printf("not find \n");

}

else

{

printf("find ,%d\n", hs->head[ret]);

}

// system("pause");

return 0;

}

内核链表结构如下:

http://www.xdnf.cn/news/537751.html

相关文章:

  • 整数的个数
  • Ollama 如何在显存资源有限的情况下合理分配给不同的服务?
  • 理解前端工程化
  • 新书速览|鸿蒙HarmonyOS NEXT开发之路 卷2:从入门到应用篇
  • java集成mqtt
  • 停等协议(Stop-and-Wait Protocol)
  • AI人工智能写作平台:AnKo助力内容创作变革!
  • 铅铋环境下应力腐蚀的疲劳试验装置
  • 什么业务需要用到waf
  • 20. 自动化测试框架开发之Excel配置文件的IO开发
  • 【monai 教程】transform之CropPad详解
  • 磁流体 磁性流体 磁液
  • 封装一个基于 WangEditor 的富文本编辑器组件(Vue 3 + TypeScript 实战)
  • UEFI Spec 学习笔记---33 - Human Interface Infrastructure Overview---33.2.6 Strings
  • Oracle 中 open_cursors 参数详解:原理、配置与性能测试
  • 一键无损批量压缩图片 保留高清细节 开源免费!支持 10 + 格式转换
  • HashMap 的特点及应用场景
  • GraphQL 接口设计
  • SRS流媒体服务器(6)源码分析之推流篇
  • 2025.05.19【Barplot】柱状图的多样性绘制
  • Linux句柄数过多问题排查
  • stm32如何触摸屏设置显示按钮
  • c#将json字符串转换为对象数组
  • Linux-进程信号
  • Python 与 Java 在 Web 开发中的深度对比:从语言特性到生态选型
  • GPU状态监控
  • MPCount: 人群计数的单域泛化
  • 【成品设计】基于 STM32 的智能鞋柜系统
  • TransmittableThreadLocal实现上下文传递-笔记
  • 「HHT(希尔伯特黄变换)——ECG信号处理-第十三课」2025年5月19日