先序遍历的非递归版本是三种遍历里面最简单的,因为遍历过程无需保存根节点以便从子节点返回时访问。
/* 二叉树节点结构 */
struct BinaryTreeNode {
int data;
BinaryTreeNode* lchild;
BinaryTreeNode* rchild;
BinaryTreeNode(int _data = -1):
data(_data),lchild(NULL),rchild(NULL){}
};
void preOrderTraverseNonRecursively( BinaryTreeNode *pRoot ) {
if( pRoot == NULL ) {
printf("Empty tree!\n");
return;
}
stack
stk;
BinaryTreeNode* pCurNode = NULL;
stk.push( pRoot );
while( !stk.empty() ) {
pCurNode = stk.top();
printf( "%d ", pCurNode ->data ); /* 访问该节点 */
stk.pop();
if( pCurNode ->rchild ) /* 先让右孩子进栈 */
stk.push( pCurNode ->rchild );
if( pCurNode ->lchild ) /* 再让左孩子进栈 */
stk.push( pCurNode ->lchild );
}
}