From 3ce8fc1bd957acbcb26e60d0d0f021f515b17adb Mon Sep 17 00:00:00 2001 From: Kim Yang Date: Wed, 26 Aug 2020 16:58:56 +0800 Subject: [PATCH] :triangular_flag_on_post: add pre/next of ThreadBitree --- .../DS_4_3_ThreadedBiTree.cpp | 53 +++++++++++++++++-- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/DataStructure/DS_4_TreeAndBinaryTree/DS_4_3_ThreadedBiTree.cpp b/DataStructure/DS_4_TreeAndBinaryTree/DS_4_3_ThreadedBiTree.cpp index 927a959..3370f1a 100644 --- a/DataStructure/DS_4_TreeAndBinaryTree/DS_4_3_ThreadedBiTree.cpp +++ b/DataStructure/DS_4_TreeAndBinaryTree/DS_4_3_ThreadedBiTree.cpp @@ -18,6 +18,8 @@ typedef struct ThreadNode { int ltag, rtag;//左右线索标志 } ThreadNode, *ThreadTree; /**定义模块**/ + +/**实现模块**/ ThreadNode *pre = NULL;//全局变量用于暂存当前访问结点的前驱 void visit(ThreadNode *q) { @@ -176,11 +178,52 @@ void CreatPostThread_CSKaoYan(ThreadTree T) { } } -// +//中序线索二叉树找中序后继 +//找到以P为根的子树中,第一个被中序遍历的结点 +ThreadNode *FirstNode(ThreadNode *p){ + //循环找到最左下结点(不一定是叶结点) + while(0==p->ltag){ + p=p->lchild; + } + return p; +} +//在中序线索二叉树中找到结点p的后继结点 +ThreadNode *NextNode(ThreadNode *p){ + //在右子树中最左下结点 + if(0==p->rtag)return FirstNode(p->rchild); + else return p->rchild; +} + +//对中序线索二叉树进行中序遍历(利用线索实现的非递归算法),空间复杂度为O(1); +void InOrder(ThreadNode *T){ + for (ThreadNode *p = FirstNode(T); p!=NULL ; p=NextNode(p)) { + visit(p); + } +} + +//中序线索二叉树找中序前驱 +//找到以p为根的子树中,最后一个被中序遍历的结点 +ThreadNode *LastNode(ThreadNode *p){ + //循环找到最右下结点(不一定是叶结点) + while(0==p->rtag)p=p->rchild; + return p; +} + +//在中序线索二叉树中找到结点p的前驱结点 +ThreadNode *PreNode(ThreadNode *p){ + //左下子树中最右结点 + if(0==p->ltag)return LastNode(p->lchild); + else return p->lchild; +} + +//对中序线索二叉树进行逆向中序遍历 +void RevInOrder(ThreadNode *T){ + for (ThreadNode *p = LastNode(T); p!=NULL ; p=PreNode(p)) { + visit(p); + } +} -/**实现模块**/ -//坐等填坑 /**实现模块**/ @@ -188,11 +231,13 @@ void CreatPostThread_CSKaoYan(ThreadTree T) { /**测试模块**/ void testModule() { + printf("开始测试!\n"); + printf("结束测试!\n"); } /**测试模块**/ int main() { - + testModule(); return 0; } \ No newline at end of file