二叉树的前序遍历:
void PerOrder(BinaryTree tree)
{
stack<Node*>stack;
Node* p = tree;
while (p||!stack.empty())
{
//先将最有左边的节点入栈
while (p)
{
cout << p->value << ends;
stack.push(p);
p = p->lChild;
}
//遍历到最底下,然后开始访问右边的节点
if (!stack.empty())
{
p = stack.top();
stack.pop();
p = p->rChild;
}
}
}
二叉树的中序遍历:
void MidOrder(BinaryTree tree)
{
stack<Node*>stack;
Node* p = tree;
while (p || !stack.empty())
{
//先将最有左边的节点入栈
while (p)
{
stack.push(p);
p = p->lChild;
}
//遍历到最底下,然后开始访问右边的节点
if (!stack.empty())
{
p = stack.top();
cout << p->value << ends;
stack.pop();
p = p->rChild;
}
}
二叉树的后序遍历:
//后序遍历:巧妙的运用两个栈结合的方式来实现树的非递归的后序遍历
void PostOrder(BinaryTree tree)
{
stack<Node*>s1, s2;
s1.push(tree);
while (!s1.empty())
{
Node* p = s1.top();
s2.push(p);
s1.pop();
//在这里由于栈先进后出的特性,并且会将s1中的元素压入到s2中,所以s1左右孩子的
//入栈顺序是先左后右,s2的入栈顺序是先右后左,s2的出栈顺序是先左后右,符合规则
if (p->lChild != nullptr)
{
s1.push(p->lChild);
}
if (p->rChild != nullptr)
{
s1.push(p->rChild);
}
}
while (!s2.empty())
{
cout << s2.top()->value << ends;
s2.pop();
}