题目描述
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
将根节点存进vector后,把其左右节点先后放进队列,下次从队首取出一个节点,将该节点val存进vector,重复........
开始被返回值vector<int>所限制,存节点的容器也用了vector,但它根本没有pop_front方法,操作队首不方便。改成list,queue都报错,只存进了根节点。
原来是!!!result和temp的定义不能在递归函数里面,不然每次调用函数,temp都是新的,但怎么return是根节点而不是叶节点没弄明白(返回时怎么个递归的)。把两句定义拿出来,就可以啦。
#include<cstdlib>
#include<vector>
#include<queue>
class Solution {
public:
vector<int> result;
queue<TreeNode*> temp;
vector<int> PrintFromTopToBottom(TreeNode* root) {
if(root == NULL) return result;
result.push_back(root->val);
if(root->left != NULL)
{
temp.push(root->left);
}
if(root->right != NULL)
{
temp.push(root->right);
}
if(!temp.empty())
{
TreeNode* node = temp.front();
temp.pop();
PrintFromTopToBottom(node);
}
return result;
}
};
调错总结:
(1)vector没有pop_front方法;
(2)虽说list和queue都可行,但要注意方法使用正确,不能混淆。list用的 push_back,pop_back。queue用的 push,pop。
注意deque与list方法类似。list是基于链表实现的,而deque是基于动态数组实现的。
所以啊,递归实现最好重写一个函数,在实现函数里面调用。
循环实现
#include<cstdlib>
#include<vector>
#include<list>
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> result;
list<TreeNode*> temp;
if(root == NULL) return result;
temp.push_back(root);
while(temp.size())
{
TreeNode* pNode = temp.front();
result.push_back(pNode->val);
temp.pop_front();
if(pNode->left)
temp.push_back(pNode->left);
if(pNode->right)
temp.push_back(pNode->right);
}
return result;
}
};