二叉树遍历

[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)。

posted @ 2024-12-06 10:50  yaoguyuan  阅读(9)  评论(0编辑  收藏  举报