二叉树的先序、中序、后序、层次遍历等的非递归实现
C++
部分代码参考王道
-
先序的非递归实现
#include <stack> using namespace std; void preOrder(BTNode* root){ stack<BTNode *> s; BTNode *p = root; while (p || !s.empty()) { if (p) { visit(p); s.push(p); p = p->left; } else { p = s.top(); s.pop(); p = p->right; } } }
-
中序遍历的非递归实现
void InOrder(BTNode* root){ stack<BTNode *> s; BTNode *p = root; while (p || !s.empty()) { if (p) { s.push(p); p = p->left; } else { p = s.top(); s.pop(); visit(p); p = p->right; } } }
-
后序遍历的非递归实现
// 后序遍历 void PostOrder(BTNode* root){ stack<BTNode *> s; BTNode *p = root; BTNode *pre = NULL; while(p || !s.empty()){ if(p){ s.push(p); p = p->left; } else{ p = s.top(); //如果 p 的右子树存在且未被访问过 if(p->right && p->right != pre){ p = p->right; } else{ s.pop(); visit(p); pre = p; p = NULL;//继续看栈顶元素 } } } }
-
层次遍历 (BFS) 的非递归实现
用队列TreeNode* bfs(TreeNode* root) { if (!root) return NULL; TreeNode *p = NULL; queue<TreeNode *> q; q.push(root); while (!q.empty()) { p = q.front(); q.pop(); if (p->left) q.push(p->left); if (p->right) q.push(p->right); // 操作 } return root; }
-
深度优先遍历的非递归实现
TreeNode* dfs(TreeNode* root) { if (!root) return NULL; TreeNode *p = NULL; stack<TreeNode *> s; s.push(root); while (!s.empty()) { p = s.top(); s.pop(); if (p->left) s.push(p->left); if (p->right) s.push(p->right); // 操作 } return root; }