/*中序遍历过程中进行中序线索化 */ void InThread(BiThrTree p) { if(p) { InThread(p->lchild); if(!p->lchild) { p->ltag = 1; p->lchild = pre; /*pre 是一个全局指针,始终指向一个刚刚访问过的节点,便于指向 一开始就是一个虚构的头节点,游离于原来的树之外的*/ } else { p->ltag = 0; } if(!pre->rchild) { pre->rtag = 1; pre->rchild = p; } else { pre->rtag = 0; } pre = p; InThread(p->rchild); } }
/* *中序遍历建立二叉索引树 */ BiThrTree InOrderThr(BiThrTree p) { BiThrTree root = (BiThrTree)malloc(sizeof(BiThrNode)); root->ltag = 0; /*建立虚拟根节点*/ root->rtag = 1; root->lchild = p; root->rchild = root; if(!p) { root->lchild = root; } else { pre = root; InThread(p); /*线索化*/ pre->rchild = root; /*最后访问的那个节点的后继节点为虚拟的根节点*/ pre->rtag = 1; root->rchild = pre; /*虚拟根节点的后继节点为最后访问的那个节点*/ } return root; /*不要误以为root是局部指针变量不可在函数中返回 在这里它保存的是堆空间首地址,所以可以直接返回传递给上一级的变量保存 */ }
bool Skein::InCurrentThread(Node* node) { return InThread(node,m_inst.current); }