对于二叉树的层次遍历,本人实现了递归版本与非递归的版本。
要求对于给定的二叉树, 输出的结果为[ [ 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() 函数即可。