二叉树的遍历

112 阅读1分钟

二叉树的先序、中序、后序递归与迭代代码

#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(); // root可能指向空,因此指向stk的第一个
        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;
        }
    }
}