当前位置: 首页 > 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;

}

内核链表结构如下:

相关文章:

  • 操作系统————五种页面置换算法(OPT,FIFO,LRU,NRU,加强版NRU)大总结
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(24):受身形
  • 4.7 时间模块
  • 《深入理解数组名:sizeof(arr)、arr 和 arr 的区别》
  • 开源情报的发展前景与行业运用
  • 后退的风景
  • Spring boot 集成 Knife4j
  • 专题五:floodfill算法(扫雷游戏精讲)
  • vs2017编译zlib1.2.11
  • 定积分,不定积分,变限积分和反常积分的对比记忆
  • 高防CDN:让攻击流量“一键清零“的智能防御之道
  • C++类与对象--3 C++对象模型和this指针
  • interface接口和defer场景分析
  • 深入理解动态规划:从斐波那契数列到最优子结构
  • ORPO:让大模型调优更简单高效的新范式
  • Ubuntu——配置静态IP
  • python next 函数
  • 大模型训练计算显存占用
  • 部署springBoot项目的脚本-linux
  • 【MYSQL】基本查询,表的增删查改
  • 广东茂名信宜出现龙卷,一家具厂铁皮房受损
  • 第78届世界卫生大会20日审议通过“大流行协定”
  • 外媒称北斗挑战GPS地位,外交部:中国的北斗也是世界的北斗
  • 凤阳县鼓楼四周连夜搭起围挡,安徽省文物局已介入调查
  • 甘肃省白银市一煤矿发生透水事故,3人失联
  • CBA官方对孙铭徽罚款3万、广厦投资人楼明停赛2场罚款5万