diff --git a/DataStructure/DS_3_String/DS_3_0_SString.cpp b/DataStructure/DS_3_String/DS_3_0_SString.cpp index ff09f58..aaed6bd 100644 --- a/DataStructure/DS_3_String/DS_3_0_SString.cpp +++ b/DataStructure/DS_3_String/DS_3_0_SString.cpp @@ -10,55 +10,164 @@ typedef struct { char ch[MAXLEN];//每个分量存储一个字符 int length; //串的实际长度 -}SString; +} SString; -bool InitStr(){ +bool InitStr() { } //求子串 -bool SubString(SString &Sub,SString S,int pos,int len){ - if (pos+len-1>S.length)return false; - for (int i = pos; i < pos+len; ++i) - Sub.ch[i-pos+1]=S.ch[i]; - Sub.length=len; +bool SubString(SString &Sub, SString S, int pos, int len) { + if (pos + len - 1 > S.length)return false; + for (int i = pos; i < pos + len; ++i) + Sub.ch[i - pos + 1] = S.ch[i]; + Sub.length = len; return true; } //比较操作,若S>T,则返回值>0;若S=T,则返回值=0;若S T.length) {//匹配成功 + return k; + } else { + return 0; + } +} + +//简单模式匹配——王道教材写法 +int Index_Simple_CSKaoYan(SString S, SString T) { + int i = 1;//i记录当前主串指针 + int j = 1;//j记录模式串指针 + while (i < S.length && j < T.length) { + if (S.ch[i] == T.ch[j]) { + ++i; + ++j;//继续比较后续字符 + } else { + i = i - j + 2; //检查下一个字串 + j = 1;//重制j的值 + } + } + if (j > T.length) {//匹配成功 + return i - T.length; + } else { + return 0; + } +} + +//KMP算法 +int Index_KMP(SString S, SString T, int next[]) { + int i = 1, j = 1; + while (i <= S.length && j <= T.length) { + if (j == 0 || S.ch[i] == T.ch[j]) { + ++i; + ++j;//继续比较后继字符 + } else { + j = next[j];//模式串向右移动 + } + } + if (j > T.length)//匹配成功 + return i - T.length; + else + return 0; +} + +//求模式串T的next数组 +void Get_Next(SString T, int next[]) { + int i = 1, j = 0; + next[1] = 0; + while (i < T.length) { + if (j == 0 || T.ch[i] == T.ch[j]) { + ++i; + ++j; + //如果pi=pj,则next[j+1]=next[j]+1 + next[i] = j; + } else { + //否则令j=next[j],循环继续 + j = next[j]; + } + } +} + +//KMP2 +int Index_KMP1(SString S, SString T) { + int i = 1, j = 1; + int next[T.length + 1]; + Get_Next(T, next); + while (i <= S.length && j <= T.length) { + if (j == 0 || S.ch[i] == T.ch[j]) { + ++i; + ++j;//继续比较后继字符 + } else { + j = next[j];//模式串向右移动 + } + } + if (j > T.length)//匹配成功 + return i - T.length; + else + return 0; +} + +//优化next数组 +void Get_BetterNext(SString T, int betterNext[]) { + int i = 1, j = 0; + int next[T.length + 1]; + Get_Next(T, next);//先求出next数组 + betterNext[1] = 0;//令betterNext[1]=0 + for (int j = 2; j <= T.length; ++j) { + if (T.ch[next[j]] == T.ch[j]) + betterNext[j] = betterNext[next[j]];//这里涉及三个数组的对比,仔细看看 + else + betterNext[j] = next[j]; + } +} + +void TestStr() { printf("开始测试!\n"); printf("测试结束!\n"); } -int main(){ +int main() { TestStr(); - return 0; + return 0; } diff --git a/DataStructure/DS_3_String/DS_3_2_LString.cpp b/DataStructure/DS_3_String/DS_3_2_LString.cpp index 60d2bee..a8f0e0c 100644 --- a/DataStructure/DS_3_String/DS_3_2_LString.cpp +++ b/DataStructure/DS_3_String/DS_3_2_LString.cpp @@ -2,7 +2,7 @@ // Created by kim yang on 2020/8/8. // -//链式存储 +//链式存储——单结点单字符 #include typedef struct StringNode{ diff --git a/DataStructure/DS_3_String/DS_3_3_LString.cpp b/DataStructure/DS_3_String/DS_3_3_LString.cpp index 3198159..53a4fd5 100644 --- a/DataStructure/DS_3_String/DS_3_3_LString.cpp +++ b/DataStructure/DS_3_String/DS_3_3_LString.cpp @@ -2,7 +2,7 @@ // Created by kim yang on 2020/8/8. // -//链式存储 +//链式存储——单结点多字符 #include typedef struct StringNode{ diff --git a/DataStructure/DS_4_TreeAndBinaryTree/Doc_4_7_线索二叉树.md b/DataStructure/DS_4_TreeAndBinaryTree/Doc_4_7_线索二叉树.md index 87c3df9..923b1fd 100644 --- a/DataStructure/DS_4_TreeAndBinaryTree/Doc_4_7_线索二叉树.md +++ b/DataStructure/DS_4_TreeAndBinaryTree/Doc_4_7_线索二叉树.md @@ -1 +1,44 @@ # 线索二叉树 + +![image-20200810110140084](https://cdn.jsdelivr.net/gh/KimYangOfCat/MyPicStorage/2021-CSPostgraduate-408/20200810110140.png) + +## 二叉树的中序遍历序列存在的问题 + +![image-20200810133755960](https://cdn.jsdelivr.net/gh/KimYangOfCat/MyPicStorage/2021-CSPostgraduate-408/20200810133756.png) + +**不能直接从指定结点开始中序遍历** + +## 中序线索二叉树 + +![image-20200810134119656](https://cdn.jsdelivr.net/gh/KimYangOfCat/MyPicStorage/2021-CSPostgraduate-408/20200810134119.png) + +### 线索二叉树的存储结构 + +![image-20200810134318361](https://cdn.jsdelivr.net/gh/KimYangOfCat/MyPicStorage/2021-CSPostgraduate-408/20200810134318.png) + +![image-20200810134401938](https://cdn.jsdelivr.net/gh/KimYangOfCat/MyPicStorage/2021-CSPostgraduate-408/20200810134401.png) + +## 先序线索二叉树 + +![image-20200810134451790](https://cdn.jsdelivr.net/gh/KimYangOfCat/MyPicStorage/2021-CSPostgraduate-408/20200810134451.png) + +### 先序线索二叉树的存储结构 + +![image-20200810134658200](https://cdn.jsdelivr.net/gh/KimYangOfCat/MyPicStorage/2021-CSPostgraduate-408/20200810134658.png) + +## 后序线索二叉树 + +![image-20200810134712565](https://cdn.jsdelivr.net/gh/KimYangOfCat/MyPicStorage/2021-CSPostgraduate-408/20200810134712.png) + +### 后序线索二叉树的存储结构 + +![image-20200810134733209](https://cdn.jsdelivr.net/gh/KimYangOfCat/MyPicStorage/2021-CSPostgraduate-408/20200810134733.png) + +## 对比 + +![image-20200810134806808](https://cdn.jsdelivr.net/gh/KimYangOfCat/MyPicStorage/2021-CSPostgraduate-408/20200810134806.png) + +## 总结回顾 + +![image-20200810134838622](https://cdn.jsdelivr.net/gh/KimYangOfCat/MyPicStorage/2021-CSPostgraduate-408/20200810134838.png) + diff --git a/DataStructure/DS_4_TreeAndBinaryTree/Doc_4_8_二叉树的线索化.md b/DataStructure/DS_4_TreeAndBinaryTree/Doc_4_8_二叉树的线索化.md index b1ba80a..f01739f 100644 --- a/DataStructure/DS_4_TreeAndBinaryTree/Doc_4_8_二叉树的线索化.md +++ b/DataStructure/DS_4_TreeAndBinaryTree/Doc_4_8_二叉树的线索化.md @@ -1,2 +1,11 @@ # 二叉树的线索化 +![image-20200810105331721](https://cdn.jsdelivr.net/gh/KimYangOfCat/MyPicStorage/2021-CSPostgraduate-408/20200810105331.png) + +用土办法找到中序前驱 + +![image-20200810134958011](https://cdn.jsdelivr.net/gh/KimYangOfCat/MyPicStorage/2021-CSPostgraduate-408/20200810135203.png) + +## 中序线索化 + +![image-20200810135151257](https://cdn.jsdelivr.net/gh/KimYangOfCat/MyPicStorage/2021-CSPostgraduate-408/20200810135151.png) \ No newline at end of file