二叉树的非递归遍历

二叉树是一种基础数据结构,有很多复杂的数据结构是在其基础上设计的。二叉树基本的操作包括先序、中序、后序三种遍历。本文用C++介绍这三种常见遍历方式的非递归实现和二叉树的层次遍历。

二叉树的结构:

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

一、先序遍历

vector<int> preOrder(TreeNode *root)
{
    vector<int> v;
    stack<TreeNode *> s;
    s.push(root);
    while (!s.empty())
    {
        TreeNode *p = s.top();
        s.pop();
        if (p != 0)
        {
            v.push_back(p->val);
            s.push(p->right);
            s.push(p->left);
        }
    }
    return v;
}

二、中序遍历

vector<int> preOrder(TreeNode *root)
{
    vector<int> v;
    stack<TreeNode *> s;
    s.push(root);
    while (true)
    {
        while (s.top() != 0)
        {
            s.push(s.top()->left);
        }
        s.pop();
        if (s.empty())
        {
            break;
        }
        TreeNode *p = s.top();
        s.pop();
        v.push_back(p->val);
        s.push(p->right);
    }
    return v;
}

三、后序遍历

vector<int> preOrder(TreeNode *root)
{
    vector<int> v;
    if (root == 0)
    {
        return v;
    }
    stack<TreeNode *> s;
    TreeNode *p = root;
    do {
        while (p != 0)
        {
            s.push(p);
            p = p->left;
        }
        TreeNode *right = 0;
        while (!s.empty())
        {
            p = s.top();
            if (p->right == right)
            {
                s.pop();
                v.push_back(p->val);
                right = p;
            }
            else
            {
                p = p->right;
                break;
            }
        }
    } while (!s.empty());
    return v;
}

四、层次遍历

vector<vector<int>> levelOrder(TreeNode* root)
{
    vector<vector<int>> vs;
    if (root == 0) return vs;
    queue<TreeNode *> q;
    q.push(root);
    q.push(0);
    vs.push_back(vector<int>());
    while (!q.empty())
    {
        TreeNode *p = q.front();
        q.pop();
        if (p != 0)
        {
            vs.back().push_back(p->val);
            if (p->left != 0) q.push(p->left);
            if (p->right != 0) q.push(p->right);
        }
        else
        {
            if (q.empty()) break;
            vs.push_back(vector<int>());
            q.push(0);
        }
    }
    return vs;
}
posted @ 2018-08-07 11:40  Engreal  阅读(2562)  评论(0编辑  收藏  举报