层次遍历 二叉树

来源:互联网 发布:javascript实例300下载 编辑:程序博客网 时间:2024/05/16 00:29

对于二叉树的层次遍历,本人实现了递归版本与非递归的版本。

要求对于给定的二叉树, 输出的结果为[   [  1   ]  ,  [  2  , 3  ] , [4 , 5 ]   ]

 

注意:只需要将各个层之间的界限确定清楚就好了。

迭代版本:(使用队列,利用空指针作为层与层之间分隔的标记)。

    vector<vector<int> > levelOrder(TreeNode *root) {        queue<TreeNode *> q;        TreeNode *temp = root;        vector<vector<int> > vecs;        if(root==NULL)return vecs;        vector<int> vec;        q.push(temp);        q.push(NULL);        TreeNode *prev = NULL;        while(!q.empty())        {            temp = q.front();            q.pop();            if(temp == NULL && prev == NULL)                break;            if(temp == NULL)            {                vecs.push_back(vec);                vec.clear();                q.push(NULL);                prev = temp;                continue;            }            vec.push_back(temp->val);            if(temp->left)q.push(temp->left);            if(temp->right)q.push(temp->right);            prev = temp;        }        return vecs;    }

递归版本:

    void traverse(TreeNode *root, int level, vector<vector<int> > & vecs)    {        if(root == NULL)return;        if(level > vecs.size())vecs.push_back(vector<int>());        vecs[level-1].push_back(root->val);        traverse(root->left, level+1, vecs);        traverse(root->right, level+1, vecs);    }    vector<vector<int> > levelOrder(TreeNode *root) {        vector<vector<int> > vecs;        traverse(root, 1, vecs);        return vecs;    }

上述还可使用两个队列,分别用来存储前一层和后一层的树中的节点。代码如下:

    vector<vector<int> > levelOrder(TreeNode *root) {        queue<TreeNode *> queue1;        queue<TreeNode *> queue2;        vector<vector<int> > allLevels;        vector<int> level;        if(root == NULL) return allLevels;        queue1.push(root);        while(!queue1.empty())        {            TreeNode *temp = queue1.front();            queue1.pop();            if(temp->left)queue2.push(temp->left);            if(temp->right)queue2.push(temp->right);            level.push_back(temp->val);            if(queue1.empty())            {                swap(queue1,queue2);                allLevels.push_back(level);                level.clear();            }        }        return allLevels;    }


变式:要求将数组从叶子节点开始输出,只需要在上述程序中加上 reverse() 函数即可。

0 0