子串数目
字符串的长度为n,则子串的个数就是个,"software"中非空子串的个数就是8+7+....+1=36个。
二叉树叶节点个数
度为1的节点数为,度为2的节点数为。
叶节点数
共个点,条边。
线索二叉树
利用空余的指针,左前驱右后继
循环队列
队空:
队满:
DFS
/* 邻接表存储的图 - DFS */ void Visit( Vertex V ) { printf("正在访问顶点%d\n", V); } /* Visited[]为全局变量,已经初始化为false */ void DFS( LGraph Graph, Vertex V, void (*Visit)(Vertex) ) { /* 以V为出发点对邻接表存储的图Graph进行DFS搜索 */ PtrToAdjVNode W; Visit( V ); /* 访问第V个顶点 */ Visited[V] = true; /* 标记V已访问 */ for( W=Graph->G[V].FirstEdge; W; W=W->Next ) /* 对V的每个邻接点W->AdjV */ if ( !Visited[W->AdjV] ) /* 若W->AdjV未被访问 */ DFS( Graph, W->AdjV, Visit ); /* 则递归访问之 */ }
BFS
/* 邻接矩阵存储的图 - BFS */ /* IsEdge(Graph, V, W)检查<V, W>是否图Graph中的一条边,即W是否V的邻接点。 */ /* 此函数根据图的不同类型要做不同的实现,关键取决于对不存在的边的表示方法。*/ /* 例如对有权图, 如果不存在的边被初始化为INFINITY, 则函数实现如下: */ bool IsEdge( MGraph Graph, Vertex V, Vertex W ) { return Graph->G[V][W]<INFINITY ? true : false; } /* Visited[]为全局变量,已经初始化为false */ void BFS ( MGraph Graph, Vertex S, void (*Visit)(Vertex) ) { /* 以S为出发点对邻接矩阵存储的图Graph进行BFS搜索 */ Queue Q; Vertex V, W; Q = CreateQueue( MaxSize ); /* 创建空队列, MaxSize为外部定义的常数 */ /* 访问顶点S:此处可根据具体访问需要改写 */ Visit( S ); Visited[S] = true; /* 标记S已访问 */ AddQ(Q, S); /* S入队列 */ while ( !IsEmpty(Q) ) { V = DeleteQ(Q); /* 弹出V */ for( W=0; W<Graph->Nv; W++ ) /* 对图中的每个顶点W */ /* 若W是V的邻接点并且未访问过 */ if ( !Visited[W] && IsEdge(Graph, V, W) ) { /* 访问顶点W */ Visit( W ); Visited[W] = true; /* 标记W已访问 */ AddQ(Q, W); /* W入队列 */ } } /* while结束*/ }
冒泡
void BubbleSort(int a[], int n) { bool finished = 0; while (!finished) { finished = 1; for (int i = 0; i < n - 1; ++i) if (a[i + 1] < a[i]) swap(a[i], a[i + 1]), finished = 0; } }
直接插入
void InsertSort(int a[], int n) { // poke card for (int i = 1, j; i < n; ++i) { int tmp = a[i]; for (j = i; j > 0 && a[j - 1] > tmp; --j) a[j] = a[j - 1]; a[j] = tmp; } }
选择排序
void SelectSort(int a[], int n) { for (int i = 0; i < n; ++i) { int minpos = i, minvalue = a[i]; for (int j = i; j < n; ++j) // Find the min element in unorder part if (minvalue > a[j]) minpos = j, minvalue = a[j]; swap(a[i], a[minpos]); } }
归并排序
void Merge(int arr[], int left, int mid, int right) { int n1 = mid - left + 1, n2 = right - mid; int L[n1], R[n2]; for (int i = 0; i < n1; i++) L[i] = arr[left + i]; for (int j = 0; j < n2; j++) R[j] = arr[mid + 1 + j]; int i = 0, j = 0, k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) arr[k++] = L[i++]; else arr[k++] = R[j++]; } while (i < n1) arr[k++] = L[i++]; while (j < n2) arr[k++] = R[j++]; } void MergeSort(int arr[], int l, int r) { if (l < r) { int m = l + (r - l) / 2; MergeSort(arr, l, m); MergeSort(arr, m + 1, r); Merge(arr, l, m, r); } }
堆排序
void MaxHeapify(int a[], int start, int end) { int dad = start, son = dad * 2 + 1; while (son <= end) { if (son + 1 <= end && a[son] < a[son + 1]) ++son; if (a[dad] > a[son]) return; else swap(a[dad], a[son]), dad = son, son = dad * 2 + 1; } } void HeapSort(int a[], int len) { for (int i = len / 2 - 1; i >= 0; --i) MaxHeapify(a, i, len - 1); for (int i = len - 1; i > 0; --i) swap(a[0], a[i]), MaxHeapify(a, 0, i - 1); }
快速排序
void QuickSort(int s[], int l, int r) { if (l < r) { int i = l, j = r, x = s[l]; while (i < j) { while (i < j && s[j] >= x) j--; // 从右向左找第一个小于x的数 if (i < j) s[i++] = s[j]; while (i < j && s[i] < x) i++; // 从左向右找第一个大于等于x的数 if (i < j) s[j--] = s[i]; } s[i] = x; QuickSort(s, l, i - 1); // 递归调用 QuickSort(s, i + 1, r); } }
求二叉树深度
int getHeight(BinTreeNode *t){ if(t=NULL)return 0; int L=getHeight(t->LChild); int R=getHeight(t->RChild); if(L>R)return L+1; else return R+1; }
求二叉排序树最大关键字
int GetMaxNode(BinTreeNode *t){ while(t->RChlid!=NULL)t=t->RChild; return t->data; }