这里需要考虑死循环的问题:例如如果在先序遍历中,如果遍历到D的时候,线序遍历肯定在D的那个递归循环中,已经将D的左结点指向了在上一层循环中将B结点定为pre结点的,同时如果D结点的左子树为空,根据如果结点的左子树为空,那么该结点的左子树的指针,指向该节点的直接前驱,所以在递归调用该结点的左子树的时候,就会发生又回到的B结点的循环造成了死循环。
所以,需要在进入下一个递归循环的时候判断是否在该结点的左子树存在,作为该结点的后继结点,进入下一步递归循环,这是必须要注意的
Node* pre;
void preOrder(Node* root)
{
if (root == NULL)
{
return;
}
/*该结点不为空*/
Node* tmpnode = NULL;
tmpnode = root;
pre = tmpnode;
cout << tmpnode->data << endl;
if (tmpnode->lchild == NULL && tmpnode!=NULL)
{
tmpnode->ltag = 1;
tmpnode->lchild = pre;
}
if (pre!=NULL && pre->rchild==NULL)
{
pre->rchild = tmpnode;
tmpnode->rtag = 1;//rchild进入的下一个循环是该循环结点的pre结点
}
pre = root;
/*这里必须要判断等于0,因为这样才不会导致程序进入死循环*/
if (tmpnode->ltag == 0)
{
preOrder(tmpnode->lchild);
}
if (tmpnode->rtag == 0)
{
preOrder(root->rchild);
}
}
#pragma endregion