在前面的博客中, 我们已经学习了给二叉树加中序线索的方法. 接下来我们来学习中序遍历线索二叉树的方法.
首先, 我们需要找到二叉树T中第一个被中序遍历的结点: 根据中序遍历的算法逻辑, (※)也就是找到二叉树T的最左下结点. 下面的算法可定位到二叉树的最左下结点.
BiTreeNode* FirstNode(BiTreeNode* T)//在以T为根的子树中, 寻找最左下结点(中序遍历中第一个被访问的结点)
{
if(T->LTag==1)//根节点的左子树为空
{
//那么第一个被中序遍历的结点就是根节点T
return T;
}
else//T的左子树不空
{
while(T->LTag==0)//如果该结点的LTag==1, 则该结点的左子树为空, 也即找到以T为根的子树最左下的结点
{
T=T->LChild;
}
return T;
}
}
接着, 我们需要找到某结点在中序遍历序列下的后继结点: 如果该结点的RChild指针已被线索化, 那么该结点的右孩子就是要寻找的中序后继结点; 如果该结点的RChild结点未被线索化, 那么以该结点的右孩子为树根,寻找以该结点右孩子为树根的二叉树中第一个被中序遍历的结点.
BiTreeNode* NextNode(BiTreeNode* T)//在中序线索二叉树中找到T的后继结点
{
if(T->RTag==1)//该结点的右孩子指针域已被线索化, 直接返回该结点的右孩子指针即可
{
return T->RChild;
}
else//