Acy夕拾算法 Week1_day6

LeetCode 102. 二叉树的层序遍历

/*代码随想录
整理思路:
每层要如何保存?哪层的?如何保存遍历过的元素的子节点?
借助队列保存每层遍历过的元素 和 对应的子节点,先进先出
放入根节点,记录当队列size大小,弹出一个 size --,同时加入它的子节点
size=0时,重新记录队列的size

每层一个数组,记录完再一起push_back
输入为空时,记得判断
*/

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        if(root == nullptr) return {};

        int size;
        queue<TreeNode*> node_que;
        vector<vector<int>> res;
        node_que.push(root);

        while( !node_que.empty() )//不是对节点判断,而是队列
        {
            size = node_que.size();
            vector<int> level_res;
            while(size--)
            {
                TreeNode* node = node_que.front();
                if(node != nullptr)
                {
                    level_res.push_back(node->val);
                    node_que.pop();
                    if(node->left)  node_que.push(node->left);
                    if(node->right)  node_que.push(node->right);
                }
            }
            res.push_back(level_res);
        }
        return res;
    }
};

LeetCode 107. 二叉树的层序遍历 II

/*
整理思路:
还是 前序遍历放入队列,但答案先以层为单位放入栈,再从栈弹出放入vector—实现倒叙;
leetcode官方:用102的代码,最后reverse(res.begin(), res.end());实现倒叙。
*/

用栈倒序

class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        if(root == nullptr) return {};

        int size;
        vector<vector<int>> res;
        stack<vector<int>> stack_res;//比102多加了个栈
        queue<TreeNode*> node_que;
        node_que.push(root);
        while( !node_que.empty() )
        {
            vector<int> level_res;
            size = node_que.size();
            while(size--)
            {
                TreeNode* node = node_que.front();
                level_res.push_back(node->val);
                node_que.pop();
                if(node->left)  node_que.push(node->left);
                if(node->right) node_que.push(node->right);
            }
            stack_res.push(level_res);//先放入栈
        }
        while(!stack_res.empty())
        {
            res.push_back(stack_res.top());//再从栈弹出到数组
            stack_res.pop();
        }
        return res;
    }
};

用reverse()

102代码最后加一个reverse()

            res.push_back(level_res);
        }
        reverse(res.begin(), res.end());//最后加一个reverse即可
        return res;
    }
};

LeetCode 199. 二叉树的右视图

/*
我的思路:
题目意思,即 只返回每层的最右侧的节点。
方法一-1:还是102,前序遍历,覆盖着存值-------不优美
方法一-2:已知了每层的size,size==0时即为最后一次遍历,此时的节点即为最后右节点,返回其值
方法二:DFS
*/

//方法一-2
class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        if(root == nullptr) return {};

        int size;
        vector<int> res;
        queue<TreeNode*> node_que;
        node_que.push(root);
        while( !node_que.empty() )
        {
            size = node_que.size();
            // int num_res;
            while(size--)
            {
                TreeNode* node = node_que.front();
                // num_res = node->val;
                if(size == 0)//最右
                    res.push_back(node->val);
                node_que.pop();
                if(node->left)  node_que.push(node->left);
                if(node->right)  node_que.push(node->right);
            }
            // res.push_back(num_res);
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值