剑指offer——从上往下打印二叉树

题目描述

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

将根节点存进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;
    }
};

猜你喜欢

转载自blog.csdn.net/eartha1995/article/details/81086815