嵌入式自学第二十四天
树:有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; } |
内核链表结构如下: