递归版本:
void _InOrderR(Node<T>* pRoot)
{
if (NULL == pRoot)//出口
return;
_InOrderR(pRoot->LC);//访问左子树
cout << pRoot->data << " ";//访问结点
_InOrderR(pRoot->RC);//访问右子树
}
非递归版本:
void _InOrderNor(Node<T>* pRoot)
{
if (NULL == pRoot)
return;
stack<Node<T>*> s;//利用栈结构来保存结点
Node<T>* pTmp = pRoot;
//开始时栈为空,循环条件是为了能够进入循环
while (NULL != pTmp || !s.empty())
{
while (pTmp)
{
//一直向左找到最左边的结点,保存路径上的所有节点
s.push(pTmp);
pTmp = pTmp->LC;
}
//访问栈顶的结点
pTmp = s.top();
s.pop();
cout << pTmp->data << " ";
//将该结点的右孩子看做一颗树,再次进行遍历,若右孩子不存在,
//那么就进不去上面的while,就会去访问该节点之前的一个结点
pTmp = pTmp->RC;
}
}