/** * 对二叉树进行线索化时使用到的,中序遍历二叉树 */ void BiThr::inThreading(BiThrNode *treeNode) { //我们递归对这个二叉树进行中序遍历 if (treeNode != nullptr) { //中序遍历,优先遍历左子树 inThreading(treeNode->lchild); if (treeNode == nullptr) { //如果上面的递归结束,到了叶子节点,或者左边已经是空节点了,那么我们就把他进行线索化,指向前驱 treeNode->lchild = pre; treeNode->LTag = BiThrNode::PointerTag::Thread; }//if //在设定新的前驱之前,我们前面一个前驱的后继就是当前的节点 if (pre->rchild == nullptr) { pre->rchild = treeNode; pre->LTag = BiThrNode::PointerTag::Thread; }//if //左边结束,中间 pre = treeNode; //最后右边 inThreading(treeNode->rchild); }//if }
/** * 把线索二叉树进行线索化 */ void BiThr::inOrderThreading() { //我们先创建一个空的头结点,左边用来指向我们的二叉树的根,右边指向最后一个元素 BiThrNode *pHead = new BiThrNode(); pHead->LTag = BiThrNode::PointerTag::Link; pHead->rchild = pHead; //先暂时把右边指向自己因为我们不知道,二叉树是否存在 pHead->RTag = BiThrNode::PointerTag::Thread; //接下来判断二叉树是否存在 if (Thrt == nullptr) { //如果二叉树不存在 pHead->lchild = pHead; //全都指向自己 }//if else { pre = pHead; //最开始的前驱,就是空的头节点 pHead->lchild = Thrt; //左边指向根 inThreading(Thrt); //把二叉树进行线索化 //最后我们的前序(pre)在线索化之后,指向的是遍历到的中序的最后一个节点 pre->rchild = pHead; pre->RTag = BiThrNode::PointerTag::Thread; //最后我们的头结点的右边指向最后一个二叉树的节点 pHead->rchild = pre; }//else //最后得到新的头结点 Thrt = pHead; }
void inorderThreading(BiTTree T,BiTTree &p) { p = (BiTTree)malloc(sizeof(BiTNode)); if(!p) exit(0); else { p->ltag = Link; p->rtag = Thread; p->rchild = p; } if(!T) { p->lchild = p; } else { p->lchild = T; pre = p; inThreading(T); pre->rchild = p; /*最后处理工作*/ pre->rtag = Thread; p->rchild = pre; } }
void inThreading(BiTTree T) { if( T ) { inThreading(T->lchild); //先序遍历左子树 if(!T->lchild) { T->ltag = Thread; T->lchild = pre; } if(!pre->rchild) { pre->rtag = Thread; pre->rchild = T; } pre = T; inThreading(T->rchild); //先序遍历右子树 } }