//使用栈模拟二叉树遍历(非递归) void preOrderNoRecursive(TreeNode* root) { stack<TreeNode*> s; while ((NULL != root) || !s.empty()) { if (NULL != root) { visit(root); s.push(root); root = root->left; } else { root = s.top(); s.pop(); root = root->right; } } } //使用栈模拟二叉树中序遍历(非递归) void inOrderNoRecursive(TreeNode* root) { stack<TreeNode*> s; while ((NULL != root) || !s.empty()) { if (NULL != root) { s.push(root); root = root->left; } else { root = s.top(); visit(root); s.pop(); root = root->right; } } } //二叉树后序遍历的非递归遍历中当 当前节点存在右子树的时候需要先遍历右子树,因此要对二叉树的节点定义中添加tag域,标志当前节点右子树是否已经遍历 void postOrderNoRecursive(TreeNode* root) { stack<TreeNode*> s; while ((root != NULL) || (!tree.empty())) { while (root != NULL) { tree.push(root); root = root->left; } if (!tree.empty()) { root = tree.top(); //表明该节点的右子树已经遍历过 if (root->tag) { visit(root); tree.pop(); //该节点及其子树访问完成,下一步从栈中再一次取节点 root = NULL; } //说明该节点的右子树还没有遍历过 else { root->tag = true; root = root->right; } } } }