题目:
有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。
给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。
按层打印二叉树的核心问题 在于 确保每一层都打印完再进行下一行的打印。 因为二叉树每个节点都有左右子树,所以判断依据是该 节点Node 是最右边即可知道每一层的结束
用一个队列来管理待打印节点
核心在于出列后,判断节点左右有没有子树放入队列, last 和nlast 每次移动都会改变nlast的位置,直到 当前节点==last节点时。该层遍历完毕。last=nlast。即last跳到下一列的最右边。该层完成继续进行下一层
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class TreePrinter {
public:
vector<vector<int> > printTree(TreeNode* root) {
// write code here
vector<vector<int>> result;
vector<int> row;
TreeNode* last = root;
TreeNode* nlast = nullptr;
TreeNode* node = nullptr;
int level = 0;
queue<TreeNode*> Q;
Q.push(root);
while (!Q.empty())
{
//打印队列中出队列
node = Q.front();
Q.pop();
row.push_back(node->val);
if(node->left){
Q.push(node->left);
nlast = node->left;
}
if (node->right)
{
Q.push(node->right);
nlast = node->right;
}
if(node==last){
last = nlast;
result.push_back(row);
row.clear();
}
//判断nlast情况
}
return result;
}
};