diff --git a/DataStructure/DS_4_TreeAndBinaryTree/DS_4_3_ThreadedBiTree.cpp b/DataStructure/DS_4_TreeAndBinaryTree/DS_4_3_ThreadedBiTree.cpp index b352478..927a959 100644 --- a/DataStructure/DS_4_TreeAndBinaryTree/DS_4_3_ThreadedBiTree.cpp +++ b/DataStructure/DS_4_TreeAndBinaryTree/DS_4_3_ThreadedBiTree.cpp @@ -29,6 +29,7 @@ void visit(ThreadNode *q) { pre->rchild = q; pre->rtag = 1; } + pre = q; } //中序遍历二叉树,一边遍历一边线索化 @@ -51,6 +52,133 @@ void CreatInThread(ThreadTree T) { } } +//中序线索化(王道教材版) +void InThread_CSKaoYan(ThreadTree p, ThreadTree &pre) { + if (p != NULL) { + InThread_CSKaoYan(p->lchild, pre);//递归,线索化左子树 + if (p->lchild == NULL) {//左子树为空,建立前驱线索 + p->lchild = pre; + p->ltag = 1; + } + if (pre != NULL && pre->rchild == NULL) { + pre->rchild == p;//建立前驱结点的后及线索 + pre->rtag = 1; + } + pre = p; + InThread_CSKaoYan(p->rchild, pre); + } +} + +//中序线索化二叉树(王道教材版本) +void CreatInThread_CSKaoYan(ThreadTree T) { + ThreadTree pre = NULL; + if (T != NULL) { + InThread_CSKaoYan(T, pre); + pre->rchild = NULL;//思考:为什么处理最后一个结点时没有判断rchild 是否为NULL? + pre->rtag = 1;//答:因为最后一个结点的右孩子必为空。 + } +} + +//先序线索化,一边遍历一边线索化 +void PreThread(ThreadTree T) { + if (T != NULL) { + visit(T); + if (0 == T->ltag) {//lchild不是前驱线索 + PreThread(T->lchild); + } + PreThread(T->rchild); + } +} + +//创建先序线索化二叉树T +void CreatPreThread(ThreadTree T) { + pre == NULL; + if (T != NULL) { + PreThread(T); + if (pre->rchild == NULL) { + pre->rtag = 1;//处理遍历的最后一个结点 + } + } +} + +//先序线索化(王道教程版本) +void PreThread_CSKaoYan(ThreadTree p, ThreadTree &pre) { + if (p != NULL) { + if (p->lchild == NULL) { + p->lchild = pre; + p->ltag = 1; + } + if (pre != NULL && pre->rchild == NULL) { + pre->rchild == p;//建立前驱结点的后及线索 + pre->rtag = 1; + } + pre = p; + if (0 == p->ltag) { + PreThread_CSKaoYan(p->lchild, pre); + } + PreThread_CSKaoYan(p->rchild, pre); + } +} + +//先序线索化二叉树(王道教材版本) +void CreatPreThread_CSKaoYan(ThreadTree T) { + ThreadTree pre = NULL; + if (T != NULL) { + PreThread_CSKaoYan(T, pre); + if (pre->rchild = NULL)//处理遍历的最后一个结点 + pre->rtag = 1; + } +} + +//后序线索二叉树 +void PostThread(ThreadTree T) { + if (T != NULL) { + PostThread(T->lchild); + PostThread(T->rchild); + visit(T); + } +} + +//创建后序线索二叉树T +void CreatPostThread(ThreadTree T) { + pre == NULL; + if (T != NULL) { + PostThread(T); + if (pre->rchild == NULL) { + pre->rtag = 1;//处理遍历的最后一个结点 + } + } +} + +//后序线索化(王道教程版本) +void PostThread_CSKaoYan(ThreadTree p, ThreadTree &pre) { + if (p != NULL) { + PostThread_CSKaoYan(p->lchild, pre); + PostThread_CSKaoYan(p->rchild, pre); + if (p->lchild == NULL) { + p->lchild = pre; + p->ltag = 1; + } + if (pre != NULL && pre->rchild == NULL) { + pre->rchild == p;//建立前驱结点的后及线索 + pre->rtag = 1; + } + pre = p; + } +} +//后序线索化二叉树(王道教材版本) +void CreatPostThread_CSKaoYan(ThreadTree T) { + ThreadTree pre = NULL; + if (T != NULL) { + PostThread_CSKaoYan(T, pre); + if (pre->rchild = NULL)//处理遍历的最后一个结点 + pre->rtag = 1; + } +} + +// + + /**实现模块**/ //坐等填坑