对于后序遍历,需要明确,往往叶子结点,只能指向右子树(如果右子树存在的情况),或者指向该结点(因为这才是后序遍历),同样在进行退出到前一次递归的时候,我们要将pre指向当前的结点,这样才能够让退回上一个循环的指针,在满足条件的情况下,将结点指向它当前递归返回的它的下一个递归的pre直接结点前驱(我感觉这样能够好理解一点)
后序遍历的线索化二叉树
#pragma region 后序线索化
Node* pre;
void PostOrder(Node* root)
{
if (root == NULL)
{
return;
}
Node* tmpnode = NULL;
tmpnode = root;
PostOrder(tmpnode->lchild);
PostOrder(tmpnode->rchild);
if (tmpnode->lchild == NULL && tmpnode != NULL)
{
tmpnode->ltag = 1;
tmpnode->lchild = pre;
}
if (pre->rchild == NULL&& pre!=NULL)
{
pre->rchild = tmpnode;
pre->rtag = 1;
}
pre = root;
cout << tmpnode->data << endl;
}
#pragma endregion