Description:
Given a binary tree, return the bottom-up level order traversal of its nodes’ values. (ie, from left to right,
level by level from leaf to root).
For example: Given binary tree {3,9,20,#,#,15,7},
return its bottom-up level order traversal as:
[
[15,7]
[9,20],
[3],
]
分析:
同上,后面reverse一下即可
代码:
#include <iostream>
#include <queue>
#include <vector>
#define Elementype int
using namespace std;
typedef struct TreeNode //树结点
{
Elementype val;
TreeNode *left;
TreeNode *right;
TreeNode(Elementype x) : val(x), left(nullptr), right(nullptr) {}
} *Tree;
int index = 0; //全局索引变量
//使用先序遍历创建创建二叉树
void MakeBinaryTree(Tree &T, Elementype value[])
{
Elementype c = value[index++];
if (c == '#')
T = nullptr;
else
{
T = new TreeNode(c);
MakeBinaryTree(T->left, value);
MakeBinaryTree(T->right, value);
}
}
//使用两个队列,一个队列用来存放当前level指针,另一个队列用来存储下一个将要访问的level
vector<vector<Elementype> > BinaryTreepostorderTraversal(Tree root)
{
queue<Tree> curQue, nextQue;
vector<vector<Elementype> > result;
vector<Elementype> level;
Tree p = root;
curQue.push(p);
while (!curQue.empty())
{
p = curQue.front();
level.push_back(p->val);
curQue.pop();
if (p->left != nullptr)
nextQue.push(p->left);
if (p->right != nullptr)
nextQue.push(p->right);
if (curQue.empty())
{
result.push_back(level);
level.clear();
swap(nextQue, curQue);
}
}
reverse(result.begin(), result.end()); //结果翻转
return result;
}
int main()
{
Tree T = nullptr;
//注意,每个结点都要有值,注意这里的取值不要等于35,即#
vector<vector<Elementype>> result;
Elementype data[11] = {3, 9, '#', '#', 20, 15, '#', '#', 7, '#', '#'};
MakeBinaryTree(T, data);
result = BinaryTreepostorderTraversal(T);
cout << "[" << endl;
for (auto &s : result)
{
cout << " [";
for (auto &t : s)
cout << t << " ";
cout << "],"<<endl;
}
cout <<"]"<< endl;
system("pause");
return 0;
}
测试: