23-07-15

剑指offer 32 - 1. 从上到下打印二叉树

思路

因为要层序遍历,所以就不好采用递归的方法来实现。所以借用queue来实现层序遍历。
首先将root节点放入queue中,然后当queue不为空时进行循环。其中首先记录queue的顶部的数值,然后放到ans中输出。然后判断当前头节点的左右子节点是否为空,如果不为空就放入queue中。直到queue成为一个空队列,说明遍历结束,输出ans数组。

代码

class Solution {
public:
    vector<int> levelOrder(TreeNode* root) {
        vector<int> ans;
        if(root == NULL){
            return ans;
        }
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()){
            TreeNode* temp = que.front();
            ans.push_back(temp->val);
            if(temp->left) que.push(temp->left);
            if(temp->right) que.push(temp->right);
            que.pop();
        }
        return ans;
    }
};

剑指offer 32 - 2. 从上到下打印二叉树

思路

和上一题类似,需要层序遍历,但是改为每一层分别用一个vector来存储。
所以在判断queue是否为空之后,先获取当前queue中的节点个数,这个数量表示这一层需要添加左右子节点的节点数,然后根据这个size数量来进行循环,将每一层的vector都push到ans中。最后输出ans。

代码

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> ans;
        if(root == NULL){
            return ans;
        }
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()){
            vector<int> res;
            int size = que.size();
            while(size--){
                TreeNode* temp = que.front();
                res.push_back(temp->val);
                if(temp->left) que.push(temp->left);
                if(temp->right) que.push(temp->right);
                que.pop();
            }
            ans.push_back(res);
        }
        return ans;
    }
};

剑指offer 32 - 3. 从上到下打印二叉树

思路

一样是层序遍历,需要做的就是控制从左到右还是从右到左,这个通过一个flag来控制。
需要注意的是,每一行的val值不再通过vector来进行存储,因为vector只能push_back,这里采用deque双向队列来实现,deque能够实现push_back和push_front。
然后通过vector<int>把deque的类型进行强转,存入ans

代码

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> ans;
        if(root == NULL){
            return ans;
        }
        queue<TreeNode*> que;
        que.push(root);
        bool flag = 1;
        while(!que.empty()){
            int size = que.size();
            deque<int> res;
            while(size--){
                TreeNode* temp = que.front();
                if(flag == 1){
                    res.push_back(temp->val);
                }
                else{
                    res.push_front(temp->val);
                }
                if(temp->left) que.push(temp->left);
                if(temp->right) que.push(temp->right);
                que.pop();
            }
            flag = !flag;
            ans.push_back(vector<int>(res.begin(),res.end()));
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值