二叉树遍历非递归算法——先序遍历
二叉树是一种很重要的数据结构,在互联网面试笔试中,二叉树都是考察的重点和难点。很多关于二叉树的问题都涉及到了二叉树的遍历,根据二叉树根结点被访问
的顺序,可以将二叉树的遍历分为:先序遍历(根、左、右),中序遍历(左、根、右),后序遍历(左、右、根)。二叉树遍历的算法可以采用递归来实现,也可以采用非递归
的方式来实现。由于采用递归的方式实现二叉树的遍历太简单,因此在这里直接略过,着重掌握二叉树遍历的非递归算法。
先序遍历二叉树的时候,首先访问根结点,再访问左孩子,最后访问右孩子。在二叉树先序遍历非递归算法中,先将根结点压栈,在栈不为空的时候执行循环:
让栈顶元素p出栈,访问栈顶元素p,如果p的右孩子不为空,则让其右孩子先进栈,如果p的左孩子不为空,则再让其左孩子进栈(注意:进栈顺序一定是先右
孩子,再左孩子)。
二叉树先序遍历的非递归算法实现如下:
#include <stdlib.h> #include <stdio.h> #define MAXSIZE 100 // 定义结点类型 typedef struct node { int data; struct node* lchild; struct node* rchild; } BTnode; void Preorder(BTnode* t) { BTnode* Seqstack[MAXSIZE]; int top = -1; BTnode* p; if(t != NULL) { top++; Seqstack[top] = t; // 先将根结点压栈 while(top > -1) // 栈不为空时循环 { p = Seqstack[top]; // 栈顶元素出栈 top --; printf("%d ", p->data); // 访问栈顶元素 if(p->rchild != NULL) // 如果右孩子不为空,则进栈 { top ++; Seqstack[top] = p->rchild; } if(p->lchild != NULL) // 如果左孩子不为空,则进栈 { top ++; Seqstack[top] = p->lchild; } } } }