二叉树的先序、中序、后序递归与迭代代码
#include <bits/stdc++.h>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
explicit TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
void preorderTraversalRecursion(TreeNode *root) {
if (root == nullptr) return;
cout << root->val << " ";
preorderTraversalRecursion(root->left);
preorderTraversalRecursion(root->right);
}
void preorderTraversalNonRecursion(TreeNode *root) {
stack<TreeNode *> stk;
stk.push(root);
while (!stk.empty()) {
TreeNode *cur = stk.top();
stk.pop();
cout << cur->val << " ";
if (cur->right != nullptr) stk.push(cur->right);
if (cur->left != nullptr) stk.push(cur->left);
}
}
void inorderTraversalRecursion(TreeNode *root) {
if (root == nullptr) return;
inorderTraversalRecursion(root->left);
cout << root->val << " ";
inorderTraversalRecursion(root->right);
}
void inorderTraversalNonRecursion(TreeNode *root) {
stack<TreeNode *> stk;
while (root != nullptr || !stk.empty()) {
while (root != nullptr) {
stk.push(root);
root = root->left;
}
root = stk.top();
stk.pop();
cout << root->val << " ";
root = root->right;
}
}
void postorderTraversalRecursion(TreeNode *root) {
if (root == nullptr) return;
postorderTraversalRecursion(root->left);
postorderTraversalRecursion(root->right);
cout << root->val << " ";
}
void postorderTraversalNonRecursion(TreeNode *root) {
stack<TreeNode *> stk;
TreeNode *prev = nullptr;
while (root != nullptr || !stk.empty()) {
while (root != nullptr) {
stk.emplace(root);
root = root->left;
}
root = stk.top();
stk.pop();
if (root->right == nullptr || root->right == prev) {
cout << root->val << " ";
prev = root;
root = nullptr;
} else {
stk.emplace(root);
root = root->right;
}
}
}