一、前序遍历
准备工作:将当前所指的二叉树节点入栈。
循环条件:栈非空。
循环内操作:出栈,输出该数据。并将出栈节点的孩子节点入栈,顺序为先右孩子,再左孩子,原因当然是因为前序遍历,接下来要处理的(要出栈的)应该是左孩子呀。
void Travel_Pre_Stack(Tree parent)
{
if (parent != NULL)
{
Tree stack[MAXSIZE];
int top = -1;
stack[++top] = parent;
while (top != -1)
{
Tree Node_pop= stack[top--];
cout << Node_pop->data << " ";
if (Node_pop->rchild != NULL)
{
stack[++top] = Node_pop->rchild;
}
if (Node_pop->lchild != NULL)
{
stack[++top] = Node_pop->lchild;
}
}
}
}
二、中序遍历
思路:中序遍历,理解起来,就是先把左孩子的最小事件解决了,再解决该节点的事情,再来处理右孩子的事情。右孩子当然要当做一个新的二叉树来处理,先处理左孩子的最小事件,再它本身,再处理右孩子。所以这就是循环了。
循环条件:栈不空或者出栈元素的右孩子不为空
其中右孩子不为空这个条件,很关键。好好理解哦。举例子就是仅有一个右孩子,右孩子没有孩子的二叉树。
void Travel_Mid_Stack(Tree parent)
{
if (parent == NULL)
{
return;
}
Tree stack[MAXSIZE];
int top = -1;
stack[++top] = parent;
Tree LeftChild = parent->lchild;
while (top != -1|| LeftChild!=NULL)
{
while (LeftChild != NULL)
{
stack[++top] = LeftChild;
LeftChild=LeftChild->lchild;
}
Tree Node_pop = stack[top--];
cout << Node_pop->data << " ";
LeftChild = Node_pop->rchild;
}
}
三、后序遍历
思路:
1.将一颗健康的二叉树每个节点的左右子树交换
2.前序遍历这颗畸形的二叉树
3.再将结果逆序输出。
不过在实际操作中,我们没有必要将左右子树交换。只需要在前序遍历过程中,孩子入栈的顺序颠倒,即先进入左孩子,再进入右孩子。这样就相当于实现了左右子树交换的目的。
将出栈的元素进入一个新的栈B,到时候再依次出栈,相当于实现了逆序输出。
void Travel_Post_Stack(Tree parent)
{
if (parent == NULL) return;
Tree StackA[MAXSIZE];
int top_A = -1;
Tree StackB[MAXSIZE];
int top_B = -1;
StackA[++top_A] = parent;
while (top_A != -1)
{
Tree Node_pop=StackA[top_A--];
//这里是画龙点睛之笔 实现了在前序遍历的同时又交换了左右子树的顺序
//其实思路很简单,就是左先入栈,右再入栈,实现先处理右节点,再处理左节点。
if (Node_pop->lchild != NULL)
{
StackA[++top_A] = Node_pop->rchild;
}
if (Node_pop->rchild != NULL)
{
StackA[++top_A] = Node_pop->lchild;
}
//将要输出的数据入栈,从而实现数据逆序排列。
StackB[++top_B] = Node_pop;
}
//
while (top_B != -1)
{
Tree Node_pop = StackB[top_B--];
cout << Node_pop->data << " ";
}