首先讲的是前序遍历的 非递归实现,代码如下:
//前序遍历 (栈)
void previousOrder(Bnode* root) { //Bnode是树节点类型
Stack S; //这个是一个栈,自己手写的栈
initStack(S); //初始化栈
pushStack(S, *root); /*首先将根节点压入栈,因为对于我们前序遍历来说
遍历节点和处理节点都是同一个 */
Bnode cur; //记录当前的栈顶元素
while (!isEmpty(S)) //只要栈不为空,就一直进行循环,
//栈为空的话,就代表着没有节点需要进行遍历了
{
popStack(S, cur); //首先将压入的根节点出栈,因为目前只有这一个节点
cout << cur.data << " "; //根据先序规则,先进行打印, 这里是 中
if (cur.rchild != NULL) { //这里是 右
pushStack(S, *cur.rchild);
} /*这里先判断右子树是否为空,然后入栈
因为栈的特性是先进后出,所以在栈顶的元素会被优先