数据结构算法 1.数组 1.1.将一个数组前后翻转
1 2 3 4 5 6 7 8 9 10 11 12 13 bool Delete_Min (int A[], n, &min) { if (!n) return false ; int temp = INT_MAX, m; for (int i = 0 ; i < n; i++) { if (A[i] < temp) { temp = A[i]; m = i; } } min = temp; A[m] = A[n - 1 ]; return true ; }
1.2.删除数组中值为x的元素
1 2 3 4 5 6 7 8 9 10 11 int DeleteX (int A[], x, n) { int i = 0 , j = 0 ; for (i = 0 ; i < n; i++) { if (A[i] != x) { A[j] = A[i]; j++; } } n = j; return n; }
1.3.将两个有序数组合并成一个有序数组
1 2 3 4 5 6 7 8 9 10 11 int * Merge (int A[], B[], lenA, lenB) { int *C = (int *)malloc ((lenA + lenB) * sizeof (int )); int a = 0 , b = 0 , c = 0 ; for (c = 0 ; a < lenA && b < lenB; c++) { if (A[a] <= B[b]) C[c] = A[a++]; else C[c] = B[b++]; } while (a < lenA) C[c++] = A[a++]; while (b < lenB) C[c++] = B[b++]; return C; }
1.4.真题
1 2 3 4 5 6 void ans (int A[], n, p) { int B[n], i, j; for (i = 0 , j = p; j < n; i++, j++) B[i] = A[j]; for (j = 0 ; j < p; i++, j++) B[i] = A[j]; for (i = 0 ; i < n; i++) cout << B[i]; }
1 2 3 4 5 6 7 8 9 10 11 12 13 int res (int A[], int B[], int n) { int i, j, k, mid; for (i = 0 , j = 0 , k = 0 ; k < n; k++){ if (A[i] <= B[j]) { mid = A[i]; i++; } else { mid = B[j]; j++; } } return mid; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 void Qsort (int A[], L, R) { if (L >= R) return ; 随机选择数组中一个元素和A[L]交换 int key = A[L], i = L, j = R; while (i < j) { while (i < j && key < A[j]) j--; while (i < j && A[i] <= key) i++; if (i < j) swap (A[i], A[j]); } swap (A[i], A[L]); Qsort (A, L, i - 1 ); Qsort (A, i + 1 , R); } int ans (int A[], int B[], int n) { int C[2 n], i, j; for (i = 0 ; i < n; i++) C[i] = A[i]; for (j = 0 ; j < n; i++, j++) C[i] = B[j]; Qsort (C, 0 , 2 n - 1 ); return C[n - 1 ]; }
1 2 3 4 5 6 7 8 9 10 int ans (int A[], n) { int count[n]; for (int i = 0 ; i < n; i++) count[i] = 0 ; for (int i = 0 ; i < n; i++) count[A[i]]++; for (int i = 0 ; i < n; i++) { if (count[i] > n / 2 ) return i; } return -1 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 int ans (int A[], n) { bool B[n + 2 ]; for (int i = 0 ; i < n; i++) B[i] = false ; int count = 0 ; for (int i = 0 ; i < n; i++) { if (A[i] > 0 && A[i] <= n){ count = A[i]; B[count] = true ; } } for (int i = 1 ; i < n; i++) { if (B[i] == false ) return i; } }
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 void Qsort (int A[], L, R) { if (L >= R) return ; 随机选择数组中一元素和A[L]交换; int key = A[L], i = L, j = R; while (i < j) { while (i < j && key < A[j]) j--; while (i < j && A[i] <= key) i++; if (i < j) Swap (A[i], A[j]); } Swap (A[L], A[i]); Qsort (A, L, i - 1 ); Qsort (A, i + 1 , R); } int ans (int A[], n) { Qsort (A, 0 , n - 1 ); int i = 0 ; while (A[i] <= 0 ) i++; if (n == i) return 1 ; else { if (A[i] != 1 ) return 1 ; else { int j = i + 1 ; while (j < n) { if (a[j] == a[j - 1 ]) j++; else if (a[j] == a[j - 1 ] + 1 ) j++; else return A[j - 1 ] + 1 ; } } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 int Dis (int a, b, c) { int res = abs (a - b) + abs (a - c) + abs (b - c); return res; } int Ans (int A[], int B[], int C[], int n1, int n2, int n3) { int min = INT_MAX, i, j, k, temp; for (int i = 0 ; i < n1; i++) { for (int j = 0 ; j < n2; j++) { for (int k = 0 ; k < n3; k++) { temp = Dis (A[i], B[j], C[k]); if (temp < min) min = temp; } } } return min; }
2.链表 2.1.链表的数据结构定义 2.1.1.单链表 1 2 3 4 typedef struct LNode { struct LNode *next; int data; }LNode, *LinkList;
2.1.2.双链表 1 2 3 4 typedef struct LNode { struct LNode *prior, *next; int data; }LNode, *LinkList;
2.2.链表的操作 2.2.1.头插法(插入到链表头) 1 2 3 4 5 6 void HeadInsert (LinkList &L, int key) { LNode *p = (LNode*)malloc (sizeof (LNode)); p->data = key; p->next = L->next; L->next = q; }
2.2.2.尾插法(插入到链表尾) 1 2 3 4 5 6 7 8 9 10 11 void TailInsert (LinkList &L, int key) { LNode *q = (LNode*)malloc (sizeof (LNode); q->data = key; q->next = NULL ; LNode *p = L->next, *pre = L; while (!p) { pre = p; p = p->next; } pre->next = q; }
2.2.3.链表逆置(头插法实现) 1 2 3 4 5 6 7 8 9 10 void Reverse (LinkList &L) { LNode *p = L->next, *q = NULL ; L->next = NULL ; while (!p) { q = p->next; p->next = L->next; L->next = p; p = q; } }
2.2.4.链表的遍历 1 2 3 4 5 LNode *p = L->next; while (!p) { visit (p); p = p->next; }
2.2.5.链表的删除 1 2 3 4 5 6 7 void Delete (LinkList &L, int &key) { LNode *p = L->next, *pre = L; 移动p和pre到指定结点 key = p->data; pre->next = p->next; free (p); }
2.3.链表算法题 2.3.1.删除值为x的结点 1 2 3 4 5 6 7 8 9 10 11 12 13 void DeleteX (LinkList &L, int x) { LNode *p = L->next, *pre = L; while (p) { if (p->data == x) { pre->next = p->next; free (p); p = pre->next; } else { p = p->next; pre = pre->next; } } }
2.3.2.单链表就地逆置
1 2 3 4 5 6 7 8 9 10 void reverse (LinkList &L) { LNode *p = L->next, *q; L->next = NULL ; while (p) { q = p->next; p->next = L->next; L->next = p; p = q; } }
2.3.3.将链表排序
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 LNode *Sort (LinkList L) { LNode* p = (LNode*)malloc (sizeof (Lnode)); p->next = NULL ; LNode* t = L->next, * tpre = L, *min, *minpre, *r = p; int m = INT_MAX; while (t) { while (t) { if (t->data < m) { min = t; minpre = tpre; m = t->data; } tpre = t; t = t->next; } minpre->next = min->next; r->next = min; r = min; m = INT_MAX; t = L->next; tpre = L; } r->next = NULL ; return p; }
2.3.4.拆分链表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 LNode* (LinkList &L) { LNode *p = (LNode*)malloc (sizeof (LNode); p->next = NULL ; LNode *q = L->next, *t = NULL , *r = L; r->next = NULL ; while (q) { t = q->next; r->next = q; r = q; q = t; t = q->next; q->next = p->next; p->next = q; q = t; } r->next = NULL ; return p; }
2.3.5.删除链表中的重复元素
1 2 3 4 5 6 7 8 9 10 11 12 13 void Delete (LinkList &L) { LNode *p = L->next; while (p) { LNode *post = p->next; while (post && post->data == p->data) { LNode *temp = post; post = post->next; p->next = post; free (temp); } p = p->next; } }
2.3.6.将两个递增链表合并成一个递减链表
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 void Merge (LinkList &L1, LinkList L2) { LNode *p = L1->next, *q = L2->next, *temp; L1->next = NULL ; while (p && q) { if (p->data <= q->data) { temp = p->next; p->next = L1->next; L1->next = p; p = temp; } else { temp = q->next; q->next = L1->next; L1->next = q; q = temp; } } while (p) { temp = p->next; p->next = L1->next; L1->next = p; p = temp; } while (q) { temp = q->next; q->next = L1->next; L1->next = q; q = temp; } return ; }
2.3.7.将两个递增链表合并为一个递增链表 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 LNode *Merge (LinkList L1, LinkList L2) { LNode *p = L1->next, *q = L2->next, *r, *temp; LNode *L = (LNode*)malloc (sizeof (LNode)); L->next = NULL ; r = L; while (p && q) { if (p->data <= q->data) { temp = p->next; r->next = p; r = p; p = temp; } else { temp = q->next; r->next = q; r = q; q = temp; } } while (p) { temp = p->next; r->next = p; r = p; p = temp; } while (q) { temp = q->next; r->next = q; r = q; q = temp; } r->next = NULL ; return L; }
2.3.8.判断链表是否对称
1 2 3 4 5 6 7 8 9 10 11 12 bool ans (LinkList L) { LNode* post = L->prior, * pre = L->next; while (post != pre && post->next != pre) { if (post->data != pre->data) return false ; pre = pre->next; post = post->prior; } return true ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 bool ans (LinkList L) { LNode* p = L->next; int len = 0 ; while (p != L) { p = p->next; len++; } int a = (int *)malloc (len * sizeof (int )); len = 0 ; p = L->next while (p != L) { a[len] = p->next; p = p->next; } for (int i = 0 , j = len - 1 ; i < j; i++, j--) { if (a[i] != a[j]) return false ; } return true ; }
2.3.9.依次输出链表中结点值最小的元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 void DeleteMin (LinkList &L) { LNode *p = L->next, *ppre = L->next, *min, *minpre; while (L->next != L) { p = L->next; ppre = L; int tempMin = INT_MAX; while (p != L) { if (p->data < tempMin) { min = p; minpre = ppre; } ppre = p; p = p->next; } cout << min->data; minpre->next = min->next; free (min); } free (L); }
2.3.10.真题
1 2 3 4 5 6 7 8 9 void ans (LinkList L, int k) { LNode *p = L->link, *q = L->link; for (int i = 0 ; i < k; i++) p = p->link; while (p) { p = p->link; q = q->link; } cout << q->data; }
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 void ans (LinkList str1, LinkList str2) { LNode *p = str1->next, *q = str2->next; int len1 = 0 , len2 = 0 ; while (p) { len1++; p = p->next; } while (q) { len2++; q = q->next; } int len = abs (len1 - len2); p = str1->next; q = str2->next; if (len1 >= len2) { for (int i = 0 ; i < len; i++) p = p->next; } else { for (int i = 0 ; i < len; i++) q = q->next; } while (p) { if (p == q) return p; p = p->next; q = q->next; } return NULL ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 void ans (LinkList &L) { bool A[n + 1 ]; for (int i = 0 ; i < n + 1 ; i++) A[i] = false ; LNode *p = head->next, *pre = head; while (p) { int t = abs (p->data); if (A[t]) { LNode *r = p->next; pre->next = r; free (p); p = r; } else { A[t] = true ; pre = p; p = p->next; } } }
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 void ans (NODE *L) { NODE* p = L->next, *f = L->next, *s = L->next, *q, *t; while (f->next->next && f->next) { f = f->next->next; s = s->next; } q = s->next; s->next = NULL ; LNode* post = (NODE*)malloc (sizeof (NODE)); post->next = NULL ; while (q) { t = q->next; q->next = post->next; post->next = q; q = t; } q = post->next; while (q) { r = q->next; t = p->next; q->next = p->next; p->next = q; q = r; p = t; } }
3.栈 3.1.栈的数据结构定义 3.1.1.顺序栈 1 2 3 4 5 6 #define MAXSIZE 100 typedef struct Stack { int data[MAXSIZE]; int top = -1 ; }Stack;
3.1.2.链栈 1 2 3 4 typedef struct LStack { int data; struct LStack *next; }SNode, *LStack;
3.2.顺序栈的操作 3.2.1.栈的初始化 1 2 3 void InitStack (Stack &S) { S.top = -1 ; }
3.2.2.入栈 1 2 3 4 5 bool Push (Stack &S, int key) { if (S.top == MAXSIZE - 1 ) return false ; S.data[++top] = key; return true ; }
3.2.3.出栈 1 2 3 4 5 bool Pop (Stack &S, int &key) { if (S.top == -1 ) return false ; key = S.data[top--]; return true ; }
3.2.4.判断栈空 1 2 3 4 bool IsEmpty (Stack S) { if (S.top == -1 ) return true ; else return false ; }
3.3.链栈的基本操作 3.3.1.初始化 1 2 3 4 void InitStack (LStack &S) { SNode *s = (SNode*)malloc (Sizeof (SNode)); S->next = NULL ; }
3.3.2.入栈 1 2 3 4 5 6 void Push (LStack &S, int key) { SNode *p = (SNode*)malloc (sizeof (SNode)); p->data = key; p->next = S->next; S->next = p; }
3.3.3.出栈 1 2 3 4 5 6 7 bool Pop (LStack &S, int &key) { if (S->next == NULL ) return false ; SNode *p = S->next; key = p->data; S->next = p->next; free (p); }
3.3.4.判断栈空 1 2 3 4 bool IsEmpty (LStack &S) { if (S->next == NULL ) return true ; else return false ; }
4.队列 4.1.队列的数据结构定义 4.1.1.顺序队列 1 2 3 4 5 #define MAXSIZE 100 typedef struct Queue { int data[MAXSIZE]; int front, rear; }Queue;
4.1.2.链式队列 1 2 3 4 5 6 7 8 typedef struct LNode { struct LNode *next; int data; }LNode; typedef struct Queue { LNode *front, *rear; }Queue;
4.2.顺序队列的基本操作 4.2.1.初始化 1 2 3 void InitQueue (Queue &Q) { Q.front = Q.rear = 0 ; }
4.2.2.入队 1 2 3 4 5 6 bool EnQueue (Queue &Q, int key) { if (Q.front == (Q.rear + 1 ) % MAXSIZE) return false ; Q.data[rear] = key; Q.rear = (Q.rear + 1 ) % MAXSIZE; return true ; }
4.2.3.出队 1 2 3 4 5 6 bool DeQueue (Queue &Q, int &key) { if (Q.rear == Q.front) return false ; key = Q.front; Q.front = (Q.front + 1 ) % MAXSIZE; return true ; }
4.2.4.判断队空 1 2 3 4 bool IsEmpty (Queue Q) { if (Q.front == Q.rear) return true ; else return false ; }
4.3.链式队列的基本操作 4.3.1.初始化 1 2 3 4 void InitQueue (Queue &Q) { Q.front = Q.rear = (LNode*)maloc (sizeof (LNode)); Q.front->next = NULL ; }
4.3.2.入队 1 2 3 4 5 6 7 void Queue (Queue &Q, int key) { LNode *p = (LNode*)malloc (sizeof (LNode)); p->data = key; p->next = NULL ; Q.rear->next = p; Q.rear = p; }
4.3.3.出队 1 2 3 4 5 6 7 8 9 bool DeQueue (Queue &Q, int &key) { if (Q.front == Q.rear) return false ; LNode *p = Q.front->next; key = p->data; Q.front->next = p->next; if (Q.rear == p) Q.rear = Q.front; free (p); return true ; }
4.3.4.判断队空 1 2 3 4 bool IsEmpty (Queue Q) { if (Q.rear == Q.front) return true ; else return false ; }
5.树 5.1.树的数据结构定义 5.1.1.二叉树的链式存储 1 2 3 4 typedef struct BiTree { sturct BiTree *lchild, *rchild; int value; }BiTNode, *BiTree;
5.1.2.二叉树的顺序存储 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #define MAXSIZE 100 typedef struct TreeNode { int value; bool IsEmpty; }TreeNode; void InitTree (TreeNode T[], int len) { for (int i = 0 ; i < len; i++) T[i].IsEmpty = true ; } int main () { TreeNode T[MAXSIZE]; InitTree (T); ... }
5.1.3.双亲表示法 1 2 3 4 5 6 7 8 9 10 11 #define MAXSIZE 100 typedef struct TreeNode { int data; int parent; }TreeNode; typedef struct Tree { TreeNode T[MAXSIZE]; int treeNum; }Tree;
5.1.4.孩子表示法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #define MAXSIZE 100 typedef struct Child { int index; struct Child *next; }Child; typedef struct TreeNode { Child *firstTNode; int data; }TreeNode; TreeNode T[MAXSIZE];
5.1.5.孩子兄弟表示法 1 2 3 4 5 6 #define MAXSIZE 100 typedef struct CSNode { struct CSNode *firstChild, *nextSibling; int data; }CSNode;
5.1.6.线索二叉树 1 2 3 4 5 typedef struct ThreadNode { struct ThreadNode *lchild, *rchild; int ltag, rtag; int data; }ThreadNode, *ThreadTree;
5.2.二叉树的基本操作 5.2.1.先序遍历 1 2 3 4 5 6 7 void PreOrder (BiTree T) { if (T) { visit (T); PreOrder (T->lchild); PreOrder (T->rchild); } }
5.2.2.中序遍历 1 2 3 4 5 6 7 void InOrder (BiTree T) { if (T) { InOrder (T->lchild); visit (T); InOrder (T->rchild); } }
5.2.3.后序遍历 1 2 3 4 5 6 7 void PostOrder (BiTree T) { if (T) { PostOrder (T->lchild); PostOrder (T->rchild); visit (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 typedef struct Stack { BiTNode *Node[MAXSIZE]; int top; }Stack; void PostOrder (BiTree T) { Stack S; InitStack (S); BiTNode *p, *pre; while (p || !IsEmpty (S)){ if (p) { Push (p); p = p->lchild; } else { GetTop (S, p); if (p->rchild && p->rchild != pre) { p = p->rchild; Push (p); p = p->lchild; } else { Pop (S, p); visit (p); pre = p; p = NULL ; } } } }
5.2.4.层次遍历 1 2 3 4 5 6 7 8 9 10 11 void LevelOrder (BiTree T) { InitQueue (Q); EnQueue (Q, T); BiTNode *p; while (!IsEmpty (Q)) { DeQueue (Q, p); visit (p); if (p->lchild) EnQueue (Q, p->lchild); if (p->rchild) EnQueue (Q, p->rchild); } }
5.3.并查集 5.3.1.并查集的定义和初始化 1 2 3 4 5 6 #define MAXSIZE 100 int UFSet[MAXSIZE]; void InitSet (int S[]) { for (int i = 0 ; i < MAXSIZE; i++) S[i] = -1 ; }
5.3.2.FIND操作 1 2 3 4 5 int Find (int S[], int x) { while (S[x] >= 0 ) x = S[x]; return x; }
5.3.3.UNION操作 1 2 3 4 5 6 void Union (int S[], root1, root2) { if (root1 == root2) return ; S[root2] = root1; }
5.3.4.FIND优化——压缩路径 1 2 3 4 5 6 7 8 9 10 int Find (int S[], x) { int root = x; while (S[root] >= 0 ) root = S[root]; while (x != root) { int temp = S[x]; S[x] = root; x = temp; } }
5.3.5.UNION优化——小树合并大树 1 2 3 4 5 6 7 8 9 10 11 void Union (int S[], root1, root2) { if (root1 == root2) return ; if (root1 <= root2) { S[root1] += S[root2]; S[root2] = root1; } else { S[root2] += S[root1]; S[root1] = root2; } }
5.4.二叉树算法题 5.4.1.计算二叉树中双分支结点的个数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 int count = 0 ; void PreOrder (BiTree T) { if (T) { if (T->lchild && T->rchild) count++; if (T->lchild) PreOrder (T->lchild); if (T->rchild) Preorder (T->rchild); } void ans (BiTree T) { PreOrder (T); cout << count; }
5.4.2.交换二叉树中所有左右子树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 void PostOrder (BiTree &T) { if (T) { PostOrder (T->lchild); PostOrder (T->rchild); BiTNode *t = T->lchild; T->lchild = T->rchild; T->rchild = t; } } void ans (BiTree &T) { Post (Order (T)); return ; }
5.4.3.求先序遍历第k个元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 int t = 0 ;int res = 0 ; void PreOrder (BiTree T) { if (T) { t--; if (t == 0 ) res = T->data; PreOrder (T->lchild); PreOrder (T->rchild); } } void ans (BiTree T, int k) { t = k; PreOrder (T); cout << res; }
5.4.4.删去值为x的子树
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 int k; void Delete (BiTree &T) { if (T) { DeleteX (T->lchild); DeleteX (T->rchild); free (T); } } void PreOrder (BiTree &T) { if (T) { BiTNode *t; if (T->lchild->data == k) { t = T->lchild; T->lchild = NULL ; Delete (t); } if (T->rchild->data == k) { t = t->rchild; T->rchild = NULL ; Delete (t); } if (T->lchild) PreOrder (T->lchild); if (T->rchild) PreOrder (T->rchild); } } void ans (BiTree &T, int x) { k = x; if (T->data == x) { Delete (T); return ; } else PreOrder (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 void Delete (BiTree &T) { if (T) { Delete (T->lchild); Delete (T->rchild); free (T); } } void LevelOrder (BiTree &T, int x) { if (T->data == x) { Delete (T); return ; } Queue Q; InitQueue (Q); BiTNode *p = T; EnQueue (Q, p); while (!IsEmpty (Q)) { DeQueue (Q, p); if (p->lchild) { if (p->lchild->data == x) { BiTNode *q = p->lchild; p->lchild = NULL ; Delete (q); } else EnQueue (Q, p); } if (p->rchild) { {} if (p->rchild->data == x) { BiTNode *q = p->rchild; p->rchild = NULL ; Delete (q); } else EnQueue (Q, p); } } }
5.4.5.查找二叉树中两个结点的公共祖先结点
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 BiTNode *ans (BiTree ROOT, BiTNode *p, BiTNode *q) { Stack S, Sp, Sq; S.top = -1 ; BiTNode* t = ROOT, *pre = NULL ; while (t || S.top >= 0 ) { if (t) { S.data[++S.top] = t; t = t->lchild; } else { t = S.data[S.top]; if (t->rchild && t->rchild != pre) { t = t->rchild; S.data[++S.top] = t; t = t->rchild; } else { S.top--; if (t == p) { for (int i = 0 ; i < S.top; i++) Sp.data[i] = S.data[i]; Sp.top = S.top; } if (t == q) { for (int i = 0 ; i < S.top; i++) Sq.data[i] = S.data[i]; Sq.top = S.top; } } } } for (int i = Sp.top; i >= 0 ; i--) { for (int j = Sq.top; i >= 0 ; j--) { if (Sp.data[i] == Sq.data[j]) return Sp.data[i]; } } return NULL ; }
5.4.6.求二叉树的宽度
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 typedef struct Queue { BiTNode *data[MAXSIZE]; int front, rear; }Queue; int ans (BiTree T) { if (!T) return 0 ; BiTNode *p = T; Queue Q; InitQueue (Q); EnQueue (Q, p); int last = Q.rear, count = 0 , max = INT_MIN; while (!IsEmpty (Q) { DeQueue (Q, p); count++; if (p->lchild) EnQueue (Q, p->lchild); if (p->rchild) EnQueue (Q, p->rchild); if (last == Q.front) { last = Q.rear; if (count > max) max = temp; count = 0 ; } } return max; }
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 typedef struct Queue { BiTNode *data[MAXSIZE]; int level[MAXSIZE]; int front, rear; }Queue; int ans (BiTree T) { BiTNode* p = T; Queue Q; Q.rear = Q.front = 0 ; if (T) { Q.data[Q.rear] = T; Q.level[Q.rear] = 1 ; Q.rear++; while (Q.front < Q.rear) { p = Q.data[Q.front]; int level = Q.level[Q.front]; Q.front++; if (p->lchild) { Q.data[Q.rear] = p->lchild; Q.level[Q.rear] = level + 1 ; Q.rear++; } if (p->rchild) { Q.data[Q.rear] = p->rchild; Q.level[Q.rear] = level + 1 ; Q.rear++; } } int max = INT_MIN, i = 0 , level = 1 ; while (i <= Q.rear) { int count = 0 ; while (i <= Q.rear && level == Q.level[i]) { count++; i++; } if (count > max) max = count; level = Q.level[i]; } return max; } else return 0 ; }
5.4.7.求二叉树的高度 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 int Get_Heigh (BiTree T) { int front = 0 , rear = 0 ; BiTNode* p = T; BiTNode *data[MAXSIZE]; data[rear++] = p; int last = rear, level = 0 ; while (front < rear) { p = data[front++]; if (p->lchild) data[Q.rear++] = p->lchild; if (p->rchild) data[Q.rear++] = p->rchild; if (last == front) { last = rear; level++; } } return level; }
1 2 3 4 5 6 7 8 9 int Get_High (BiTree T) { if (!T) return 0 ; else { int hl = Get_High (T->lchild); int hr = Get_High (T->rchild); int maxH = max (hl, hr) + 1 ; return maxH; } }
5.4.8.排序二叉树的判定 1 2 3 4 5 6 7 8 9 10 11 12 13 int pre = INT_MIN; int JudgeBST (BiTree T) { if (!T) return 1 ; else { int l = JudgeBST (T->lchild); if (T->data <= pre|| l == 0 ) return 0 ; pre = T->data; int r = JudgeBST (T->rchild); return r; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 int A[n]; int count = 0 ; void InOrder (BiTree T) { if (T) { InOrder (T->lchild); A[count++] = T->data; InOrder (T->rchild); } } bool ans (BiTree T) { if (!T) return true ; else if (!T->lchild && !T->rchild) return true ; else { InOrder (T); for (int i = 0 ; i < count - 1 ; i++) { if (A[i] >= A[i + 1 ]) return false ; } return true ; } }
5.4.9.平衡二叉树的判定 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 int Get_Height (BiTree T) { if (!T) return 0 ; else { int hl = Get_Height (T->lchild); int hr = Get_Height (T->rchild); int maxH = max (hl, hr) + 1 ; return maxH; } } bool JudgeBalance (BiTree T) { if (!T) return true ; else { int hl = Get_Height (T->lchild); int hr = Get_Height (T->rchild); if (abs (hl - hr) <= 1 ) { return JudgeBalance (T->lchild) && JudgeBalance (T->rchild); } else return false ; } }
5.4.10.完全二叉树的判定 ①采用层次遍历的思想,与一般层次遍历的区别是空结点也能入队
②当出队元素为空时(设该结点为P),进入内层循环(即③),逐一出队并检查该结点是否为空。
③若队中剩余元素有不为空的结点,则说明P之后还有结点(这个结点可能是与P同层,或是P的下一层)即不满足完全二叉树的定义;若队中剩余元素皆为空结点,说明P是该树的最后一个结点(最底层的最右结点),满足完全二叉树的定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 bool JudgeComplete (BiTree T) { BiTNode* data[MAXSIZE]; int front = 0 , rear = 0 ; BiTNode* p = T; data[rear++] = T; while (front < rear) { p = data[front++]; if (p) { data[rear++] = p->lchild; data[rear++] = p->rchild; } else { while (front < rear) { p = data[front++]; if (p) return false ; } } } return true ; }
5.4.11.真题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int WPL = 0 ; void InOrder (BiTree T, int deep) { if (T) { if (!T->left && !T->right) { WPL = WPL + T.weight * deep; } if (T->left) InOrder (T->left, deep + 1 ); if (T->right) InOrder (T->right, deep + 1 ); } } int ans (BiTree T) { InOrder (T, 0 ); return WPL; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 int Get_WPL (BiTree root) { BiTNode* data[MAXSIZE]; BiTNode* p = root; int f = 0 , r = 0 , level = 0 , WPL = 0 , last = 0 ; data[r++] = p; last = r; while (f < r) { p = data[f++]; if (!p->lchild && !p->rchild) WPL = WPL + level * p->weight; if (p->lchild) data[r++] = p->left; if (p->rchild) data[r++] = p->right; if (last == f) { last = r; level++; } } return WPL; }
1 2 3 4 5 6 7 8 9 10 11 12 13 void InOrder (BiTree T, int deep) { if (T) { if (deep > 1 && (T->lchild || T->rchild)) cout << '(' ; if (T->lchild) InOrder (T->lchild, deep + 1 ); cout << T->data; if (T->rchild) InOrder (T->rchild, deep + 1 ); if (deep > 1 && (T->lchild || T->rchild)) cout << ')' ; } } void ans (BiTree T) { InOrder (T, 1 ); }
6.图 6.1.图的数据结构定义 6.1.1.邻接矩阵 1 2 3 4 5 6 #define MAXVEX 100 typedef struct Graph { int data[MAXVEX]; int edge[MAXVEX][MAXVEX]; int vexNum, edgeNum; }Graph;
6.1.2.邻接表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #define MAXVEX 100 typedef struct edgeNode { struct edgeNode *next; int weight; int adjVex; }edgeNode; typedef struct vexNode { edgeNode *firstEdge; int vexData; }vexNode; typedef struct Graph { int vexNum, edgeNum; vexNode vex[MAXVEX]; }Graph;
6.2.图的遍历 6.2.1.深度优先遍历 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #define MAXVEX 100 bool visited[MAXVEX]; void DFSTraverse (Graph G) { for (int i = 0 ; i < G.vexNum; i++) { visited[i] = false ; } for (int i = 0 ; i < G.vexNum; i++) { if (!visited[i]) DFS (G, i); } } void DFS (Graph G, int v) { visit (v); visited[v] = true ; for (int w = FirstNeighbor (G, v); w >= 0 ; w = NextNeighbor (G, v, w)){ if (!visited[w]) DFS (G, w); } }
6.2.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 #define MAXVEX 100 Queue Q; bool visited[MAXVEX]; void BFSTraverse (Graph G) { for (int i = 0 ; i < G.vexNum; i++) { visited[i] = false ; } InitQueue Q; for (int i = 0 ; i < G.vexNum; i++) { if (!visited[i]) BFS (G, i); } } void BFS (Graph G, int v) { visit (v); visited[v] = true ; EnQueue (Q, v); int w; while (!IsEmpty (Q)) { DeQueue (Q, v); for (w = FirstNeighbor (G, v); w >= 0 ; w = NextNeighbor (G, v, w)) { if (!visited[w]) { visit (w); visited[w] = true ; EnQueue (Q, w); } } } }
6.3.单源最短路径 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 #define MAXVEX 100 bool visited[MAXVEX];int dis[MAXVEX];Queue Q; void Min_Dis (Graph G, int v) { for (int i = 0 ; i < G.vexNum; i++) { visited[i] = false ; dis[i] = INT_MAX; } visited[v] = true ; dis[v] = 0 ; InitQueue (Q); EnQueue (Q, v); int w; while (!IsEmpty (Q)) { DeQueue (Q, v); for (w = FisrtNeighbor (G, v); w >= 0 ; w = NextNeighbor (G, v, w) { if (!visited[w]) { visited[w] = true ; dis[w] = dis[v] + 1 ; } } } }
6.4.真题
1 2 3 4 5 6 7 8 9 10 11 12 13 int IsExistEL (MGraph G) { int count = 0 ; int i, j; for (i = 0 ; i < G.numVertices; i++){ int degree = 0 ; for (j = 0 ; j < G.numVertices; j++){ if (Edge[i][j] > 0 ) degree++; } if (degree % 2 ) count++; } if (count == 0 || count == 2 ) return 1 ; else return 0 ; }
7.快速排序 1 2 3 4 5 6 7 8 9 10 11 12 13 void QSort (int A[], L, R) { if (L >= R) return ; 随机选择数组中一元素和A[L]互换 int key = A[L], i = L, j = R; while (i < j) { while (i < j && key < A[j]) j--; while (i < j && A[i] <= key) i++; if (i < j) swap (A[i], A[j]); } swap (A[i], A[L]); Qsort (A, L, i - 1 ); Qsort (A, i + 1 , R); }
8.折半查找 1 2 3 4 5 6 7 8 9 10 int Binary_Search (int A, L, R, key) { int mid; while (L < R) { mid = (L + R) / 2 ; if (key <= A[mid]) R = mid; else L = mid + 1 ; } if (A[mid] == key) return mid; else return -1 ; }