二叉樹遍歷

yaoguyuan發表於2024-12-06

[Algo] 二叉樹遍歷

二叉樹節點型別定義:

struct BinaryTreeNode
{
    int val;
    BinaryTreeNode *left;
    BinaryTreeNode *right;
    BinaryTreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 
};

1. 前序遍歷

// 1. 非遞迴前序遍歷二叉樹
// (1) 彈出棧頂 (2) 右孩子進棧 (3) 左孩子進棧
void preOrder(BinaryTreeNode *root)
{
    stack<BinaryTreeNode *> s;
    s.push(root);
    while (!s.empty())
    {
        BinaryTreeNode *tmp = s.top();
        s.pop();
        cout << tmp->val << " ";
        if (tmp->right != nullptr) s.push(tmp->right);
        if (tmp->left != nullptr) s.push(tmp->left);
    }
    cout << endl;
}

2. 中序遍歷

// 2. 非遞迴中序遍歷二叉樹
// (1) 左鏈進棧 (2) 彈出棧頂,右孩子進棧 (3) 棧非空或當前節點非空時迴圈
void inOrder(BinaryTreeNode *root)
{
    stack<BinaryTreeNode *> s;
    while (!s.empty() || root != nullptr)
    {
        if (root != nullptr) 
        {
            s.push(root);
            root = root->left;
        }
        else
        {
            BinaryTreeNode *tmp = s.top();
            s.pop();
            cout << tmp->val << " ";
            root = tmp->right;
        }
    }
    cout << endl;
}

3. 後序遍歷

// 3. 非遞迴後序遍歷二叉樹(兩個棧)
// (1) 前序方法交換左右孩子進棧順序 (2) 彈出棧頂用另一個棧收集,最後依次出棧
void postOrder(BinaryTreeNode *root)
{
    stack<BinaryTreeNode *> s;
    stack<BinaryTreeNode *> collector;
    s.push(root);
    while (!s.empty())
    {
        BinaryTreeNode *tmp = s.top();
        s.pop();
        collector.push(tmp);
        if (tmp->left != nullptr) s.push(tmp->left);
        if (tmp->right != nullptr) s.push(tmp->right);
    }
    while (!collector.empty()) { cout << collector.top()->val << " "; collector.pop(); }
    cout << endl;
}

時間複雜度均為O(n),空間複雜度除後序遍歷為O(n)均為O(h)。

相關文章