这篇介绍一下非递归的方式实现二叉树的前序、后序和层序遍历
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int value)
: val(value), left(nullptr), right(nullptr)
{ }
};
非递归前序遍历
vector<int> biTreePreTraversal(TreeNode* root) {
if (root == nullptr) {
return vector<int>();
}
stack<TreeNode*> help;
help.push(root);
vector<int> res;
while (!help.empty()) {
root = help.top();
help.pop();
res.push_back(root->val);
if (root->right) { // 先右
help.push(root->right);
}
if (root->left) { // 后左
help.push(root->left);
}
}
return res;
}
非递归后序遍历
vector<int> biTreePosTraversal(TreeNode* root) {
if (root == nullptr) {
return vector<int>();
}
stack<TreeNode*> help;
help.push(root);
stack<int> outData;
while (!help.empty()) {
root = help.top();
help.pop();
outData.push(root->val);
if (root->left) { // 先左
help.push(root->left);
}
if (root->right) { // 后右
help.push(root->right);
}
}
vector<int> res;
while (!outData.empty()) {
res.push_back(outData.top());
outData.pop();
}
return res;
}
非递归层序遍历
vector<int> biTreeLevelTraversal(TreeNode* root) {
if (root == nullptr) {
return vector<int>();
}
queue<TreeNode*> q;
q.push(root);
vector<int> res;
while (!q.empty()) {
root = q.front();
q.pop();
res.push_back(root->val);
if (root->left) {
q.push(root->left);
}
if (root->right) {
q.push(root->right);
}
}
return res;
}
以上测试均是在win10 vs2017 64bit编译器下进行