From edc75a5303c2eae1224b8ee049943c758f736fee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BA=B7=E5=BB=BA=E4=BC=9F?= Date: Thu, 9 Apr 2020 02:34:04 +0800 Subject: [PATCH] =?UTF-8?q?:recycle:=20=E4=B8=BA=E5=85=A8=E7=BA=BF?= =?UTF-8?q?=E7=B4=A2=E4=BA=8C=E5=8F=89=E6=A0=91=E6=B7=BB=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E9=80=86=E4=B8=AD=E5=BA=8F=E9=81=8D=E5=8E=86=E5=87=BD?= =?UTF-8?q?=E6=95=B0=EF=BC=8C=E4=BB=A5=E6=96=B9=E4=BE=BF=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=89=8D=E9=A9=B1=E7=BA=BF=E7=B4=A2=E7=9A=84=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0604_BiThrTree/BiThrTree-main.c | 3 + CLion/CourseBook/0604_BiThrTree/BiThrTree.c | 106 +++++++++---- CLion/CourseBook/0604_BiThrTree/BiThrTree.h | 16 +- .../0604_BiThrTree/BiThrTree-main.cpp | 3 + .../CourseBook/0604_BiThrTree/BiThrTree.cpp | 143 ++++++++++++------ Dev-C++/CourseBook/0604_BiThrTree/BiThrTree.h | 17 ++- .../0604_BiThrTree/BiThrTree-main.c | 7 +- .../CourseBook/0604_BiThrTree/BiThrTree.c | 106 +++++++++---- .../CourseBook/0604_BiThrTree/BiThrTree.h | 16 +- VisualC++/CourseBook/CourseBook.sdf | Bin 5394432 -> 5394432 bytes VisualC++/CourseBook/CourseBook.suo | Bin 179200 -> 178688 bytes 11 files changed, 316 insertions(+), 101 deletions(-) diff --git a/CLion/CourseBook/0604_BiThrTree/BiThrTree-main.c b/CLion/CourseBook/0604_BiThrTree/BiThrTree-main.c index 29b76d6..9302af8 100644 --- a/CLion/CourseBook/0604_BiThrTree/BiThrTree-main.c +++ b/CLion/CourseBook/0604_BiThrTree/BiThrTree-main.c @@ -23,6 +23,9 @@ int main(int argc, char* argv[]) { printf("█ 中序遍历中序全线索二叉树...\n"); InOrderTraverse_Thr(Thr, PrintElem); + + // 逆中序遍历,用来验证前驱线索是否正确 + InOrderTraverse_Thr_Inverse(Thr, PrintElem); } PressEnterToContinue(debug); } diff --git a/CLion/CourseBook/0604_BiThrTree/BiThrTree.c b/CLion/CourseBook/0604_BiThrTree/BiThrTree.c index 681bec8..b65fafb 100644 --- a/CLion/CourseBook/0604_BiThrTree/BiThrTree.c +++ b/CLion/CourseBook/0604_BiThrTree/BiThrTree.c @@ -87,6 +87,8 @@ Status InOrderThreading(BiThrTree* Thrt, BiThrTree T) { * ████████ 算法6.5 ████████ * * 中序遍历中序全线索二叉树(非递归算法)。 + * + * 注:该方法可以验证后继线索是否正确 */ Status InOrderTraverse_Thr(BiThrTree T, Status(Visit)(TElemType)) { BiThrTree p = T->lchild; // p指向二叉树根结点(不同于线索二叉树的头结点) @@ -113,6 +115,8 @@ Status InOrderTraverse_Thr(BiThrTree T, Status(Visit)(TElemType)) { p = p->rchild; } + printf("\n"); + return OK; } @@ -150,31 +154,81 @@ static void CreateTree(BiThrTree* T, FILE* fp) { * 中序全线索化的内部实现 */ static void InTheading(BiThrTree p) { - if(p) { - InTheading(p->lchild); // 线索化左子树 - - // 如果当前结点的左子树为空,则需要建立前驱线索 - if(!p->lchild) { - p->LTag = Thread; - p->lchild = pre; - - // 如果左子树不为空,添加左孩子标记(教材中缺少这一步骤) - } else { - p->LTag = Link; - } - - // 如果前驱结点的右子树为空,则为前驱结点建立后继线索 - if(!pre->rchild) { - pre->RTag = Thread; - pre->rchild = p; - - // 如果右子树不为空,添加右孩子标记(教材中缺少这一步骤) - } else { - p->RTag = Link; - } - - pre = p; // pre向前挪一步 - - InTheading(p->rchild); // 线索化右子树 + if(p == NULL) { + return; } + + InTheading(p->lchild); // 线索化左子树 + + // 如果当前结点的左子树为空,则需要建立前驱线索 + if(!p->lchild) { + p->LTag = Thread; + p->lchild = pre; + + /* + * 如果左子树不为空,添加左孩子标记。 + * 教材中缺少这一步骤,这会导致出现一些幽灵BUG。 + * 这里的Link枚举值是零,如果编译器在动态分配内存后恰好把该标记初始化为0, + * 那么效果跟手动设置Link是一样的。但如果编译器没有初始化零值,那么就会出BUG。 + */ + } else { + p->LTag = Link; + } + + // 如果前驱结点的右子树为空,则为前驱结点建立后继线索 + if(!pre->rchild) { + pre->RTag = Thread; + pre->rchild = p; + + /* + * 如果右子树不为空,添加右孩子标记。 + * 教材中缺少这一步骤,这会导致出现一些幽灵BUG,理由同上。 + */ + } else { + pre->RTag = Link; + } + + pre = p; // pre向前挪一步 + + InTheading(p->rchild); // 线索化右子树 +} + + +/*━━━━━━━━━━━━━━━━━━━━━━ 辅助函数 ━━━━━━━━━━━━━━━━━━━━━━*/ + +/* + * 逆中序遍历中序全线索二叉树(非递归算法)。 + * + * 注:该方法可以验证前驱线索是否正确 + */ +Status InOrderTraverse_Thr_Inverse(BiThrTree T, Status(Visit)(TElemType)) { + BiThrTree p = T->rchild; // p指向二叉树中序遍历的最后一个结点,这也相当于是T的左子树上中序遍历的最后一个结点 + + // 空树或遍历结束时,p==T + while(p != T) { + // 访问结点p,该结点是某棵左子树上中序遍历的最后一个结点 + if(!Visit(p->data)) { + return ERROR; + } + + // 如果存在前驱线索(即没有左子树) + while(p->LTag == Thread && p->lchild != T) { + p = p->lchild; // 将p指向其前驱 + Visit(p->data); // 访问前驱结点 + } + + // 向左前进一步,可能遇到左子树,也可能遇到终点T + p = p->lchild; + + // 如果没有遇到终点,即存在左子树,则找到该左子树上中序遍历的最后一个结点 + if(p != T) { + while(p->RTag == Link) { + p = p->rchild; + } + } + } + + printf("\n"); + + return OK; } diff --git a/CLion/CourseBook/0604_BiThrTree/BiThrTree.h b/CLion/CourseBook/0604_BiThrTree/BiThrTree.h index ddc477f..b8c2061 100644 --- a/CLion/CourseBook/0604_BiThrTree/BiThrTree.h +++ b/CLion/CourseBook/0604_BiThrTree/BiThrTree.h @@ -28,6 +28,8 @@ typedef struct BiThrNode { struct BiThrNode* rchild; // 右孩子指针 PointerTag LTag; // 左指针标记 PointerTag RTag; // 右指针标记 + + struct BiThrNode* parent; // 双亲结点指针,仅在非递归后序遍历后序后继线索二叉树时使用 } BiThrNode; /* 指向线索二叉树结点的指针 */ @@ -62,12 +64,14 @@ Status CreateBiTree(BiThrTree* T, char* path); * 中序遍历二叉树T,并将其全线索化为线索二叉树Thrt。 * 注:这里的线索包括前驱线索与后继线索。 */ -Status InOrderThreading(BiThrTree *Thrt, BiThrTree T); +Status InOrderThreading(BiThrTree* Thrt, BiThrTree T); /* * ████████ 算法6.5 ████████ * * 中序遍历中序全线索二叉树T(非递归算法)。 + * + * 注:该方法可以验证后继线索是否正确 */ Status InOrderTraverse_Thr(BiThrTree T, Status(Visit)(TElemType)); @@ -84,4 +88,14 @@ static void CreateTree(BiThrTree* T, FILE* fp); */ static void InTheading(BiThrTree p); + +/*━━━━━━━━━━━━━━━━━━━━━━ 辅助函数 ━━━━━━━━━━━━━━━━━━━━━━*/ + +/* + * 逆中序遍历中序全线索二叉树(非递归算法)。 + * + * 注:该方法可以验证前驱线索是否正确 + */ +Status InOrderTraverse_Thr_Inverse(BiThrTree T, Status(Visit)(TElemType)); + #endif diff --git a/Dev-C++/CourseBook/0604_BiThrTree/BiThrTree-main.cpp b/Dev-C++/CourseBook/0604_BiThrTree/BiThrTree-main.cpp index 600f6cc..9213993 100644 --- a/Dev-C++/CourseBook/0604_BiThrTree/BiThrTree-main.cpp +++ b/Dev-C++/CourseBook/0604_BiThrTree/BiThrTree-main.cpp @@ -23,6 +23,9 @@ int main(int argc, char* argv[]) { printf(" ȫ...\n"); InOrderTraverse_Thr(Thr, PrintElem); + + // ֤ǰǷȷ + InOrderTraverse_Thr_Inverse(Thr, PrintElem); } PressEnterToContinue(debug); } diff --git a/Dev-C++/CourseBook/0604_BiThrTree/BiThrTree.cpp b/Dev-C++/CourseBook/0604_BiThrTree/BiThrTree.cpp index 4010d9b..54b0d22 100644 --- a/Dev-C++/CourseBook/0604_BiThrTree/BiThrTree.cpp +++ b/Dev-C++/CourseBook/0604_BiThrTree/BiThrTree.cpp @@ -25,10 +25,10 @@ Status CreateBiTree(BiThrTree* T, char* path) { FILE* fp; int readFromConsole; // Ƿӿ̨ȡ - + // ûļ·Ϣӿ̨ȡ readFromConsole = path == NULL || strcmp(path, "") == 0; - + if(readFromConsole) { printf("Уûӽ㣬ʹ^棺"); CreateTree(T, NULL); @@ -41,7 +41,7 @@ Status CreateBiTree(BiThrTree* T, char* path) { CreateTree(T, fp); fclose(fp); } - + return OK; } @@ -57,62 +57,66 @@ Status InOrderThreading(BiThrTree* Thrt, BiThrTree T) { if(!*Thrt) { exit(OVERFLOW); } - + (*Thrt)->data = '\0'; - + (*Thrt)->LTag = Link; // ӣҪָĸ (*Thrt)->RTag = Thread; // ָ룬ҪָһԪأԱ - + (*Thrt)->rchild = *Thrt; - + // Ϊգָָ if(!T) { (*Thrt)->lchild = *Thrt; } else { (*Thrt)->lchild = T; // ָͷ pre = *Thrt; // ¼ǰϢʼΪͷ - + InTheading(T); // Խ - + pre->rchild = *Thrt; // һָͷ pre->RTag = Thread; // һ (*Thrt)->rchild = pre; // ͷָһ㣬˫ϵ } - + return OK; - + } /* * 㷨6.5 * * ȫǵݹ㷨 + * + * ע÷֤Ƿȷ */ Status InOrderTraverse_Thr(BiThrTree T, Status(Visit)(TElemType)) { BiThrTree p = T->lchild; // pָ㣨ͬͷ㣩 - + // ʱp==T while(p != T) { // ӣ while(p->LTag == Link) { p = p->lchild; } - + // ΪյĽ㣨ߣ if(!Visit(p->data)) { return ERROR; } - + // ںû while(p->RTag == Thread && p->rchild != T) { p = p->rchild; // pָ Visit(p->data); // ʺ̽ } - + // p = p->rchild; } - + + printf("\n"); + return OK; } @@ -122,14 +126,14 @@ Status InOrderTraverse_Thr(BiThrTree T, Status(Visit)(TElemType)) { // ڲ static void CreateTree(BiThrTree* T, FILE* fp) { char ch; - + // ȡǰֵ if(fp == NULL) { scanf("%c", &ch); } else { ReadData(fp, "%c", &ch); } - + if(ch == '^') { *T = NULL; } else { @@ -150,31 +154,82 @@ static void CreateTree(BiThrTree* T, FILE* fp) { * ȫڲʵ */ static void InTheading(BiThrTree p) { - if(p) { - InTheading(p->lchild); // - - // ǰΪգҪǰ - if(!p->lchild) { - p->LTag = Thread; - p->lchild = pre; - - // Ϊգӱǣ̲ȱһ裩 - } else { - p->LTag = Link; - } - - // ǰΪգΪǰ㽨 - if(!pre->rchild) { - pre->RTag = Thread; - pre->rchild = p; - - // ΪգҺӱǣ̲ȱһ裩 - } else { - p->RTag = Link; - } - - pre = p; // preǰŲһ - - InTheading(p->rchild); // + if(p == NULL) { + return; } + + InTheading(p->lchild); // + + // ǰΪգҪǰ + if(!p->lchild) { + p->LTag = Thread; + p->lchild = pre; + + /* + * Ϊգӱǡ + * ̲ȱһ裬ᵼ³һЩBUG + * Linköֵ㣬ڶ̬ڴǡðѸñdzʼΪ0 + * ôЧֶLinkһġûгʼֵôͻBUG + */ + } else { + p->LTag = Link; + } + + // ǰΪգΪǰ㽨 + if(!pre->rchild) { + pre->RTag = Thread; + pre->rchild = p; + + /* + * ΪգҺӱǡ + * ̲ȱһ裬ᵼ³һЩBUGͬϡ + */ + } else { + pre->RTag = Link; + } + + pre = p; // preǰŲһ + + InTheading(p->rchild); // } + + +/* */ + +/* + * ȫǵݹ㷨 + * + * ע÷֤ǰǷȷ + */ +Status InOrderTraverse_Thr_Inverse(BiThrTree T, Status(Visit)(TElemType)) { + BiThrTree p = T->rchild; // pָһ㣬Ҳ൱Tһ + + // ʱp==T + while(p != T) { + // ʽpýijһ + if(!Visit(p->data)) { + return ERROR; + } + + // ǰû + while(p->LTag == Thread && p->lchild != T) { + p = p->lchild; // pָǰ + Visit(p->data); // ǰ + } + + // ǰһҲյT + p = p->lchild; + + // ûյ㣬ҵһ + if(p != T) { + while(p->RTag == Link) { + p = p->rchild; + } + } + } + + printf("\n"); + + return OK; +} + diff --git a/Dev-C++/CourseBook/0604_BiThrTree/BiThrTree.h b/Dev-C++/CourseBook/0604_BiThrTree/BiThrTree.h index 9f4a721..909320d 100644 --- a/Dev-C++/CourseBook/0604_BiThrTree/BiThrTree.h +++ b/Dev-C++/CourseBook/0604_BiThrTree/BiThrTree.h @@ -28,6 +28,8 @@ typedef struct BiThrNode { struct BiThrNode* rchild; // Һָ PointerTag LTag; // ָ PointerTag RTag; // ָ + + struct BiThrNode* parent; // ˫׽ָ룬ڷǵݹʱʹ } BiThrNode; /* ָָ */ @@ -62,12 +64,14 @@ Status CreateBiTree(BiThrTree* T, char* path); * TȫΪThrt * עǰ */ -Status InOrderThreading(BiThrTree *Thrt, BiThrTree T); +Status InOrderThreading(BiThrTree* Thrt, BiThrTree T); /* * 㷨6.5 * * ȫTǵݹ㷨 + * + * ע÷֤Ƿȷ */ Status InOrderTraverse_Thr(BiThrTree T, Status(Visit)(TElemType)); @@ -84,4 +88,15 @@ static void CreateTree(BiThrTree* T, FILE* fp); */ static void InTheading(BiThrTree p); + +/* */ + +/* + * ȫǵݹ㷨 + * + * ע÷֤ǰǷȷ + */ +Status InOrderTraverse_Thr_Inverse(BiThrTree T, Status(Visit)(TElemType)); + #endif + diff --git a/VisualC++/CourseBook/0604_BiThrTree/BiThrTree-main.c b/VisualC++/CourseBook/0604_BiThrTree/BiThrTree-main.c index 600f6cc..d1e0b03 100644 --- a/VisualC++/CourseBook/0604_BiThrTree/BiThrTree-main.c +++ b/VisualC++/CourseBook/0604_BiThrTree/BiThrTree-main.c @@ -17,12 +17,15 @@ int main(int argc, char* argv[]) { { printf(" д...\n"); CreateBiTree(&T, "TestData_Pre.txt"); - + printf(" Զȫ...\n"); InOrderThreading(&Thr, T); - + printf(" ȫ...\n"); InOrderTraverse_Thr(Thr, PrintElem); + + // ֤ǰǷȷ + InOrderTraverse_Thr_Inverse(Thr, PrintElem); } PressEnterToContinue(debug); } diff --git a/VisualC++/CourseBook/0604_BiThrTree/BiThrTree.c b/VisualC++/CourseBook/0604_BiThrTree/BiThrTree.c index 4010d9b..86fbdfd 100644 --- a/VisualC++/CourseBook/0604_BiThrTree/BiThrTree.c +++ b/VisualC++/CourseBook/0604_BiThrTree/BiThrTree.c @@ -87,6 +87,8 @@ Status InOrderThreading(BiThrTree* Thrt, BiThrTree T) { * 㷨6.5 * * ȫǵݹ㷨 + * + * ע÷֤Ƿȷ */ Status InOrderTraverse_Thr(BiThrTree T, Status(Visit)(TElemType)) { BiThrTree p = T->lchild; // pָ㣨ͬͷ㣩 @@ -113,6 +115,8 @@ Status InOrderTraverse_Thr(BiThrTree T, Status(Visit)(TElemType)) { p = p->rchild; } + printf("\n"); + return OK; } @@ -150,31 +154,81 @@ static void CreateTree(BiThrTree* T, FILE* fp) { * ȫڲʵ */ static void InTheading(BiThrTree p) { - if(p) { - InTheading(p->lchild); // - - // ǰΪգҪǰ - if(!p->lchild) { - p->LTag = Thread; - p->lchild = pre; - - // Ϊգӱǣ̲ȱһ裩 - } else { - p->LTag = Link; - } - - // ǰΪգΪǰ㽨 - if(!pre->rchild) { - pre->RTag = Thread; - pre->rchild = p; - - // ΪգҺӱǣ̲ȱһ裩 - } else { - p->RTag = Link; - } - - pre = p; // preǰŲһ - - InTheading(p->rchild); // + if(p == NULL) { + return; } + + InTheading(p->lchild); // + + // ǰΪգҪǰ + if(!p->lchild) { + p->LTag = Thread; + p->lchild = pre; + + /* + * Ϊգӱǡ + * ̲ȱһ裬ᵼ³һЩBUG + * Linköֵ㣬ڶ̬ڴǡðѸñdzʼΪ0 + * ôЧֶLinkһġûгʼֵôͻBUG + */ + } else { + p->LTag = Link; + } + + // ǰΪգΪǰ㽨 + if(!pre->rchild) { + pre->RTag = Thread; + pre->rchild = p; + + /* + * ΪգҺӱǡ + * ̲ȱһ裬ᵼ³һЩBUGͬϡ + */ + } else { + pre->RTag = Link; + } + + pre = p; // preǰŲһ + + InTheading(p->rchild); // +} + + +/* */ + +/* + * ȫǵݹ㷨 + * + * ע÷֤ǰǷȷ + */ +Status InOrderTraverse_Thr_Inverse(BiThrTree T, Status(Visit)(TElemType)) { + BiThrTree p = T->rchild; // pָһ㣬Ҳ൱Tһ + + // ʱp==T + while(p != T) { + // ʽpýijһ + if(!Visit(p->data)) { + return ERROR; + } + + // ǰû + while(p->LTag == Thread && p->lchild != T) { + p = p->lchild; // pָǰ + Visit(p->data); // ǰ + } + + // ǰһҲյT + p = p->lchild; + + // ûյ㣬ҵһ + if(p != T) { + while(p->RTag == Link) { + p = p->rchild; + } + } + } + + printf("\n"); + + return OK; } diff --git a/VisualC++/CourseBook/0604_BiThrTree/BiThrTree.h b/VisualC++/CourseBook/0604_BiThrTree/BiThrTree.h index 9f4a721..8d8eb8c 100644 --- a/VisualC++/CourseBook/0604_BiThrTree/BiThrTree.h +++ b/VisualC++/CourseBook/0604_BiThrTree/BiThrTree.h @@ -28,6 +28,8 @@ typedef struct BiThrNode { struct BiThrNode* rchild; // Һָ PointerTag LTag; // ָ PointerTag RTag; // ָ + + struct BiThrNode* parent; // ˫׽ָ룬ڷǵݹʱʹ } BiThrNode; /* ָָ */ @@ -62,12 +64,14 @@ Status CreateBiTree(BiThrTree* T, char* path); * TȫΪThrt * עǰ */ -Status InOrderThreading(BiThrTree *Thrt, BiThrTree T); +Status InOrderThreading(BiThrTree* Thrt, BiThrTree T); /* * 㷨6.5 * * ȫTǵݹ㷨 + * + * ע÷֤Ƿȷ */ Status InOrderTraverse_Thr(BiThrTree T, Status(Visit)(TElemType)); @@ -84,4 +88,14 @@ static void CreateTree(BiThrTree* T, FILE* fp); */ static void InTheading(BiThrTree p); + +/* */ + +/* + * ȫǵݹ㷨 + * + * ע÷֤ǰǷȷ + */ +Status InOrderTraverse_Thr_Inverse(BiThrTree T, Status(Visit)(TElemType)); + #endif diff --git a/VisualC++/CourseBook/CourseBook.sdf b/VisualC++/CourseBook/CourseBook.sdf index ff38922eb2596a38b6d48ab8473f0384a779468e..af3cbd9fd1dd4b6be856f86ddf42975e688bfc63 100644 GIT binary patch delta 15960 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 U@G%x2&G=}+hgrP$fR~y77mNNeXaE2J diff --git a/VisualC++/CourseBook/CourseBook.suo b/VisualC++/CourseBook/CourseBook.suo index 452ab10da6a012d63e64d9fea017f2f24e0a7e0e..9143df39c676e1a21568e20c31f90af27d1f1ffe 100644 GIT binary patch delta 5032 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 Ka4NuNu>S&wHCCSh