中序遍历的特点“左-根-右”,访问完一个节点之后,立刻转到其右子节点递归处理。
特别注意外层while循环的条件。
/* 二叉树节点结构 */
struct BinaryTreeNode {
int data;
BinaryTreeNode* lchild;
BinaryTreeNode* rchild;
BinaryTreeNode(int _data = -1):
data(_data),lchild(NULL),rchild(NULL){}
};
void inOrderTraverseNonRecursively( BinaryTreeNode* pRoot ) {
if( pRoot == NULL ) {
printf("Empty tree!\n");
return;
}
stack stk;
stk.push( pRoot );
BinaryTreeNode* pCurNode = pRoot ->lchild;
/* 第二个条件防止栈空时根节点的右子树尚未遍历。比如节点全是右节点的情况。 */
while( !stk.empty() || pCurNode != NULL ) {
while( pCurNode != NULL ) { /* 向左走,一直走到最左 */
stk.push( pCurNode );
pCurNode = pCurNode ->lchild;
}
pCurNode = stk.top();
stk.pop();
printf( "%d ", pCurNode ->data ); /* 访问该节点 */
pCurNode = pCurNode ->rchild; /* 访问完立刻转到其右子树(如果有的话) */
}
}