diff --git a/Code/Code.vcxproj b/Code/Code.vcxproj index 67ea9a1..9c770fd 100644 --- a/Code/Code.vcxproj +++ b/Code/Code.vcxproj @@ -142,6 +142,7 @@ + @@ -149,6 +150,7 @@ + diff --git a/Code/link_tree.h b/Code/link_tree.h new file mode 100644 index 0000000..87565ea --- /dev/null +++ b/Code/link_tree.h @@ -0,0 +1,121 @@ +#include +#include +#include "head.h" +#include "sequence_queue.h" + +// 链树 +typedef struct LinkTreeNode { + element_type data; + // 左右孩子结点 + struct LinkTreeNode* lchild, * rchild; +} LinkTreeNode, *LinkTree; + +// 初始化链树 +int InitLinkTree(LinkTree tree, element_type elem) { + tree->data = elem; + tree->lchild = NULL; + tree->rchild = NULL; + return 0; +} + +// 插入链树结点 +int InsertLinkTree(LinkTree tree, element_type elem) { + LinkTreeNode* node = (LinkTreeNode*)malloc(sizeof(LinkTreeNode)); + if (node) { + node->data = elem; + node->lchild = NULL; + node->rchild = NULL; + tree->lchild = node; + } + else { + printf("InsertLinkTree:分配新内存空间失败!"); + return 1; + } + return 0; +} + +// 先序遍历链树 +int PreorderTraversalLinkTree(LinkTree tree, int(*visit)(LinkTree elem)) { + if (tree != NULL) { + // 访问根元素 + int result = visit(tree); + if (result == 1) { + printf("PreorderTraversalLinkTree:访问元素操作失败!"); + return 1; + } + // 递归调用先序遍历 + PreorderTraversalLinkTree(tree->lchild, visit); + PreorderTraversalLinkTree(tree->rchild, visit); + } + return 0; +} + +// 中序遍历链树 +int InorderTraversalLinkTree(LinkTree tree, int(*visit)(LinkTree elem)) { + if (tree != NULL) { + // 递归调用中序遍历 + PreorderTraversalLinkTree(tree->lchild, visit); + // 访问根元素 + int result = visit(tree); + if (result == 1) { + printf("InorderTraversalLinkTree:访问元素操作失败!"); + return 1; + } + PreorderTraversalLinkTree(tree->rchild, visit); + } + return 0; +} + +// 后序遍历链树 +int PostorderTraversalLinkTree(LinkTree tree, int(*visit)(LinkTree elem)) { + if (tree != NULL) { + // 递归调用后序遍历 + PreorderTraversalLinkTree(tree->lchild, visit); + PreorderTraversalLinkTree(tree->rchild, visit); + // 访问根元素 + int result = visit(tree); + if (result == 1) { + printf("PostorderTraversalLinkTree:访问元素操作失败!"); + return 1; + } + } + return 0; +} + +// 求树的深度 +int GetLinkTreeDeepth(LinkTree tree) { + if (tree == NULL) { + return 0; + } + else { + // 递归遍历左右子树 + int l = GetLinkTreeDeepth(tree->lchild); + int r = GetLinkTreeDeepth(tree->rchild); + // 最后访问根 + return l > r ? l + 1 : r + 1; + } +} + +// 层序遍历链树 +int LevelorderTraversalLinkTree(LinkTree tree, int(*visit)(LinkTree elem)) { + // 建立辅助队列 + SequenceQueue queue; + // 初始化队列 + InitSequenceQueue(&queue); + // 指定元素 + LinkTree p; + // 根结点入队 + //EnterSequenceQueue(&queue, tree); + // 队列不空则循环 + while (IsSequenceQueueEmpty(queue) == 0) { + // 队头出队 + //ExitSequenceQueue(&queue, &p); + visit(p); + if (p->lchild != NULL) { + //EnterSequenceQueue(&queue, p->lchild); + } + if (p->rchild != NULL) { + //EnterSequenceQueue(&queue, p->rchild); + } + } +} \ No newline at end of file diff --git a/Code/sequence_queue.h b/Code/sequence_queue.h index f2d308d..673fb9a 100644 --- a/Code/sequence_queue.h +++ b/Code/sequence_queue.h @@ -54,4 +54,12 @@ int GetSequenceQueueHead(SequenceQueue* queue, element_type* elem) { // 根据队头指针赋值元素 *elem = queue->data[queue->front]; return 0; +} + +// 判断顺序队是否为空 +int IsSequenceQueueEmpty(SequenceQueue queue) { + if (queue.rear == queue.front) { + return 1; + } + return 0; } \ No newline at end of file diff --git a/Code/sequence_tree.cpp b/Code/sequence_tree.cpp new file mode 100644 index 0000000..f2e4dba --- /dev/null +++ b/Code/sequence_tree.cpp @@ -0,0 +1,6 @@ +#include +#include +#include "head.h" + +// 定义一个顺序树数组 +typedef int SequenceTree[MAXSIZE]; diff --git a/Data-Structrue/string.md b/Data-Structrue/string.md index b183b7e..4321029 100644 --- a/Data-Structrue/string.md +++ b/Data-Structrue/string.md @@ -60,3 +60,4 @@ KMP绠楁硶鏄鏈寸礌妯″紡鍖归厤绠楁硶鐨勪紭鍖栥 KMP绠楁硶瀵逛簬閲嶅閮ㄥ垎姣旇緝澶氱殑妯″紡涓插尮閰嶆晥鏋滄洿濂姐 +KMP绠楁硶鐨刵ext鏁扮粍瀛樺湪涓瀹氶棶棰橈紝褰撳綋鍓嶇储寮曠殑鍊煎尮閰嶅け璐ワ紝閭d箞妯″紡涓茬殑鍏朵粬鍚屾牱鍊肩殑鍦版柟涔熶竴瀹氫細鍖归厤澶辫触銆傛墍浠ュ彲浠ョ洿鎺ュ皢妯″紡涓叉墍鏈夌浉鍚屽肩殑閮ㄥ垎鐨刵ext鍊煎叏閮ㄥ彇涓哄叾next鍊煎搴旂储寮曠殑next鍊笺 diff --git a/Data-Structrue/tree.md b/Data-Structrue/tree.md new file mode 100644 index 0000000..356a5e5 --- /dev/null +++ b/Data-Structrue/tree.md @@ -0,0 +1,117 @@ +# 鏍 + +## 鍩烘湰姒傚康 + +### 鏍戠殑鍩烘湰姒傚康 + ++ 鏍戯細n涓粨鐐圭殑鏈夐檺闆嗭紙鏍戞槸涓绉嶉掑綊鐨勬暟鎹粨鏋勶紝閫傚悎浜庤〃绀哄叿鏈夊眰娆$殑鏁版嵁缁撴瀯锛夈傛槸閫掑綊瀹氫箟鐨勩 ++ 鏍圭粨鐐癸細鍙湁瀛愮粨鐐规病鏈夌埗缁撶偣鐨勭粨鐐广傞櫎浜嗘牴缁撶偣澶栵紝鏍戜换浣曠粨鐐归兘鏈変笖浠呮湁涓涓墠椹便 ++ 鍒嗘敮缁撶偣锛氭湁瀛愮粨鐐逛篃鏈夌埗缁撶偣鐨勭粨鐐广 ++ 鍙跺瓙缁撶偣锛氭病鏈夊瓙缁撶偣鍙湁鐖剁粨鐐圭殑缁撶偣銆 ++ 绌烘爲锛氱粨鐐规暟涓0鐨勬暟銆 ++ 瀛愭爲锛氬綋n>1鏃讹紝鍏朵綑缁撶偣鍙垎涓簃涓簰涓嶇浉浜ょ殑鏈夐檺闆嗗悎锛屾瘡涓泦鍚堟湰韬張鏄竴妫垫爲锛屽叾灏辨槸鏍圭粨鐐圭殑瀛愭爲銆 ++ 缁撶偣鐨勫害锛氫竴涓粨鐐圭殑瀛╁瓙锛堝垎鏀級涓暟銆 ++ 鏍戠殑搴︼細鏍戜腑缁撶偣鐨勬渶澶у害鏁般 ++ 缁撶偣鐨勫眰娆★紙娣卞害锛夛細浠庝笂寰涓嬫暟銆 ++ 缁撶偣鐨勯珮搴︼細浠庝笅寰涓婃暟銆 ++ 鏍戠殑楂樺害锛堟繁搴︼級锛氬灏戝眰銆 ++ 涓ょ粨鐐逛箣闂寸殑璺緞锛氱敱涓や釜缁撶偣涔嬮棿鎵缁忚繃鐨勭粨鐐瑰簭鍒楁瀯鎴愩 ++ 涓ょ粨鐐逛箣闂寸殑璺緞闀垮害锛氳矾寰勪笂鎵缁忚繃鐨勮竟鐨勪釜鏁般 ++ 鏍戠殑璺緞闀垮害锛氭寚鏍戞牴鍒版瘡涓粨鐐圭殑璺緞闀跨殑鎬诲拰锛屾牴鍒版瘡涓粨鐐圭殑璺緞闀垮害鐨勬渶澶у兼槸鏍戠殑楂樸 ++ 鏈夊簭鏍戯細鏍戝悇缁撶偣鐨勫瓙鏍戜粠宸﹁嚦鍙虫湁娆″簭涓嶈兘浜掓崲銆 ++ 鏃犲簭鏍戯細鏍戝悇缁撶偣鐨勫瓙鏍戜粠宸﹁嚦鍙虫棤娆″簭鍙互浜掓崲銆 + +### 妫灄鐨勫熀鏈蹇 + ++ 妫灄鏃秏妫典簰涓嶇浉浜ょ殑鏍戠殑闆嗗悎銆 ++ 涓棰楁爲鍙互琚垎涓烘.鏋椼 + +### 鏍戠殑鎬ц川 + ++ 缁撶偣鏁=鎬诲害鏁+1銆 ++ 鏍戠殑搴浠h〃鑷冲皯涓涓粨鐐瑰害鏄负m锛屼笖涓瀹氭槸闈炵┖鏍戯紝鑷冲皯鏈塵+1涓粨鐐癸紱鑰宮鍙夋爲鎸囨墍鏈夌粨鐐圭殑搴﹂兘灏忎簬绛変簬m锛屽彲浠ユ槸绌烘爲銆 ++ 搴︿负m鐨勬爲浠ュ強m鍙夋爲绗琲灞傝嚦澶氭湁$m^{i-1}$涓粨鐐广 ++ 楂樺害涓篽鐨刴鍙夋爲鑷冲鏈$\dfrac{m^h-1}{m-1}$涓粨鐐广 ++ 楂樺害涓篽鐨刴鍙夋爲鑷冲皯鏈$h$涓粨鐐癸紝搴︿负m鐨勬爲鑷冲皯鏈$h+m-1$涓粨鐐广 ++ 鍏锋湁n涓粨鐐圭殑m鍙夋爲鏈灏忛珮搴︿负$\lceil\log_m(n(m-1)+1)\rceil$銆傚凡鐭ラ珮搴︽渶灏忔椂鎵鏈夌粨鐐归兘鏈塵涓瀛愶紝鎵浠$\dfrac{m^{h-1}-1}{m-1}\lfloor\dfrac{n}{2}\rfloor$涓哄彾瀛愮粨鐐广 ++ 浜屽弶鎺掑簭鏍戯細宸﹀瓙鏍戜笂鎵鏈夌粨鐐圭殑鍏抽敭瀛楀潎灏忎簬鏍圭粨鐐圭殑鍏抽敭瀛楋紱鍙冲瓙鏍戜笂鎵鏈夌粨鐐圭殑鍏抽敭瀛楀潎澶т簬鏍圭粨鐐圭殑鍏抽敭瀛楋紱宸﹀彸瀛愭爲鍙堝悇鏄竴妫典簩鍙夋帓搴忔爲銆 ++ 骞宠 浜屽弶鏍戯細鏍戜笂浠讳竴缁撶偣鐨勫乏瀛愭爲鍜屽彸瀛愭爲鐨勬繁搴︿箣宸笉瓒呰繃1銆 + +### 浜屽弶鏍戠殑鎬ц川 + ++ 璁鹃潪绌轰簩鍙夋爲涓害涓0銆1鍜2鐨勭粨鐐逛釜鏁板垎鍒负$n_0$锛$n_1$銆$n_2$锛屽垯$n_0=n_2+1$锛堝彾瀛愮粨鐐规瘮浜屽垎缁撶偣澶氫竴涓級銆傚亣璁炬爲涓粨鐐圭殑鎬绘暟涓$n$锛屽垯$n=n_0+n_1+n_2$锛屽張鏍规嵁鏍戠殑缁撶偣绛変簬鎬诲害鏁+1寰楀埌$n=n_1+2n_2+n_0$锛屾墍浠ョ浉鍑忓氨寰楀埌缁撹銆 ++ 浜屽弶鏍戠殑绗$i$灞傝嚦澶氭湁$2^{i-1}$涓粨鐐广 ++ 楂樺害涓$h$鐨勪簩鍙夋爲鑷冲鏈$\dfrac{m^h-1}{m-1}$涓粨鐐广 ++ 鍏锋湁$n$涓粨鐐圭殑瀹屽叏浜屽弶鏍戠殑楂樺害$h=\lceil\log_2(n+1)\rceil$鎴$\lfloor\log_2n\rfloor+1$銆$2^{h-1}-1\lfloor\dfrac{n}{2}\rfloor$銆 + +濡傛灉涓嶆槸瀹屽叏浜屽弶鏍戯紝鍒欒浜屽弶鏍戠殑缂栧彿涓庡畬鍏ㄤ簩鍙夋爲鐩稿搴斿啀瀛樺叆鏁扮粍锛屽叾浠栫殑缁撶偣涓虹┖锛岃繖绉嶅瓨鍌ㄦ柟娉曚細娴垂杈冨鍐呭瓨锛屾渶鍧忔儏鍐典笅楂樺害涓$h$锛屼笖鍙湁$h$涓粨鐐圭殑鍗曟敮鏍戜篃闇瑕$2^h-1$涓瓨鍌ㄥ崟鍏冦 + +#### 閾惧紡瀛樺偍 + +閾惧紡鏍戝叿鏈変袱涓垎鍒寚鍚戝乏鍙冲瓙鏍戠殑鎸囬拡銆 + +濡傛灉瑕佷繚瀛樼埗缁撶偣鐨勪綅缃紝鍙互娣诲姞涓涓埗缁撶偣鎸囬拡锛屼粠鑰屽彉鎴愪笁鍙夐摼琛ㄣ + +### 浜屽弶鏍戠殑閬嶅巻 + +閬嶅巻鏄寜鐓ф煇绉嶆搴忓皢鎵鏈夌粨鐐归兘璁块棶涓閬嶃 + +#### 椤哄簭閬嶅巻 + +椤哄簭閬嶅巻灏辨槸娣卞害浼樺厛鐨勯亶鍘嗭紝鍒嗕负涓夌锛 + ++ 鍏堝簭閬嶅巻锛氭牴宸﹀彸NLR銆 ++ 涓簭閬嶅巻锛氬乏鏍瑰彸LNR銆 ++ 鍚庡簭閬嶅巻锛氬乏鍙虫牴LRN銆 + +鏍规嵁绠楃畻鏁拌〃杈惧紡鐨勫垎鏋愭爲鐨勪笉鍚屽厛搴忋佷腑搴忋佸悗搴忛亶鍘嗘柟寮忓彲浠ュ緱鍒板墠缂銆佷腑缂銆佸悗缂琛ㄨ揪寮忋 + +鑻ユ爲鐨勯珮搴︿负$h$锛屽垯鏃堕棿澶嶆潅搴︿负$O(h)$銆 + +#### 灞傚簭閬嶅巻 + +灞傚簭閬嶅巻灏辨槸骞垮害浼樺厛鐨勯亶鍘嗐 + +1. 鍒濆鍖栦竴涓緟鍔╅槦鍒椼 +2. 鏍圭粨鐐瑰叆闃熴 +3. 鑻ラ槦鍒楅潪绌猴紝鍒欓槦澶寸粨鐐瑰嚭闃燂紝璁块棶璇ョ粨鐐癸紝濡傛灉鏈夊苟灏嗗叾宸﹀彸瀛╁瓙鍏ラ槦銆 +4. 閲嶅姝ラ3鐩磋嚦闃熷垪绌恒 + +### 閬嶅巻搴忓垪鏋勯犱簩鍙夋爲 + +鑻ュ彧缁欏嚭涓妫典簩鍙夋爲鐨勫墠/涓/鍚/灞傚簭閬嶅巻搴忓垪涓殑涓绉嶄笉鑳藉敮涓纭畾涓妫典簩鍙夋爲銆傚彧鏈夌粰鍑轰腑搴忛亶鍘嗗簭鍒楁墠鍙兘鎺ㄥ嚭鍞竴浜屽弶鏍戯紝鍥犱负鏃犳硶纭畾鏍圭粨鐐圭浉瀵逛簬宸﹀彸缁撶偣鐨勪綅缃細 + ++ 鍓嶅簭+涓簭銆 ++ 鍚庡簭+涓簭銆 ++ 灞傚簭+涓簭銆 + +#### 鍓嶅簭+涓簭 + +鍓嶅簭锛氭牴+宸+鍙筹紱涓簭锛氬乏+鏍+鍙炽傛墍浠ユ牴鎹笁涓儴鍒嗗搴旂浉鍚屽彲浠ユ帹鍑恒 + +#### 鍚庡簭+涓簭 + +鍚庡簭锛氬乏+鏍+鍙筹紱涓簭锛氬乏+鏍+鍙炽傛墍浠ユ牴鎹笁涓儴鍒嗗搴旂浉鍚屽彲浠ユ帹鍑恒 + +#### 灞傚簭+涓簭 + +灞傚簭锛氭牴+宸︽牴+鍙虫牴锛涗腑搴忥細宸+鏍+鍙炽傛墍浠ユ牴鎹牴缁撶偣鍜屽乏鍙冲瓙鏍戠殑鏍圭粨鐐规潵纭畾銆 + +### 绾跨储浜屽弶鏍 +