//以下出现的_root标示二叉树的根节点
//非递归先序遍历(根节点->左节点->右节点)思想:即用栈实现
//遍历二叉树的前提条件是:该二叉树不为空。在满足该条件的情况下,进行以下步骤:
//1.先将二叉树的根节点push进栈。
//2.在该栈不为空的条件下,执行一个循环(先用top保存栈顶元素,再对栈进行pop操作,因为栈具有后进先出的特点
// ,所以先对top->_right进行判断是否入栈,再对top->_left进行判断是否入栈)。
//3.当栈为空时,先序遍历该二叉树结束。
void RootSort()
{
stack<BinaryTreeNode*>s;
if (_root != NULL)
{
s.push(_root);
}
while (!s.empty())
{
BinaryTreeNode*top = s.top();
s.pop();
cout << top->_value << " ";
if (top->_right)
{
s.push(top->_right);
}
if (top->_left)
{
s.push(top->_left);
}
}
cout << endl;
}
//非递归中序遍历(左节点->根节点->右节点)思想:即用栈实现
// 因为中序遍历二叉树的特点,所以在当前节点cur不为空或栈不为空的条件下(在该条件下的原因:该条件说明
// 未遍历完二叉树),开始执行循环体,进行遍历:
//(1)从当前节点cur开始,以cur为循环条件,当cur不为空时,将cur入栈,然后以cur=cur->_left跟进,直至
// 将该二叉树的最左节点入栈后,入栈操作结束
//(2)取栈顶节点:先保存该节点(用top保存该节点的原因:还要考虑该节点的右孩子)并输出该节点的值,
// 然后执行栈的pop操作。
//(3)继续以top->_right为cur值,转(1)操作.
void MidSort()
{
stack<BinaryTreeNode*>s;
BinaryTreeNode*cur = _root;
while (cur || !s.empty())
{
while (cur)
{
s.push(cur);
cur = cur->_left;
}
BinaryTreeNode*top = s.top();
s.pop();
cout << top->_value << " ";
cur = top->_right;
}
cout << endl;
}
//非递归后序遍历(左节点->右节点->根节点)思想:即用栈实现
//(1)在当前节点cur不为空或栈不为空的条件下(在该条件下的原因:该条件说明未遍历完二叉树)。
//(2)从当前节点cur开始,以cur为循环条件,当cur不为空时,将cur入栈,然后以cur=cur->_left跟进,直至
// 将该二叉树的最左节点入栈后,入栈操作结束。取栈顶节点top:先保存该节点(用top保存该节点的原因:
// 还要考虑该节点的右孩子),
//(3)若top->_right==NULL || lastVisited == top->_right,则输出top->_value,执行栈的pop操作,并执行lastVisited = top(
// 用lastVisited保存最近一个所输出的节点,待到下一次同样的操作时,若lastVisited == top->_right,则
// 说明top的右节点已经访问过了,可以访问top了,否则会陷在cur = top->_right这步操作里);
//(4)若条件(3)不满足,则继续以top->_right为cur值,转(1)操作.
void BackSort()
{
stack<BinaryTreeNode*>s;
BinaryTreeNode*cur = _root;
BinaryTreeNode*lastVisited =NULL;
while (cur || !s.empty())
{
while (cur)
{
s.push(cur);
cur = cur->_left;
}
BinaryTreeNode*top = s.top();
if (top->_right == NULL || lastVisited == top->_right)
{
s.pop();
cout << top->_value << " ";
lastVisited = top;
}
else
{
cur = top->_right;
}
}
cout << endl;
}