leetcode日记(89)二叉树的层序遍历

发布于:2025-03-12 ⋅ 阅读:(14) ⋅ 点赞:(0)

为什么下面都说很简单……难道我真的很菜吗…………

好吧可能是数据结构忘了很多,层序遍历我记得老师是讲过的。

先搜了下层序遍历惯用的套路,就是不断储存下一级(left和right)的节点,同时不断遍历储存的节点,每次将节点值放进去。

这道题和普通层序遍历还是有差别的,需要将遍历结果按照不同层分开。

这就要求记录层数。

我最初的想法是,建立存储节点的容器的同时建立存储节点对应层数的容器,每次存储下一级的节点就顺势存储这一级的层数加一。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> l;
    vector<TreeNode*> t;
    vector<vector<int>> v;
    vector<vector<int>> levelOrder(TreeNode* root) {
        if(root==NULL) return v;
        l.push_back(0);
        t.push_back(root);
        while(!l.empty()){
            int layer=l[0];
            TreeNode* tree=t[0];
            l.erase(l.begin());
            t.erase(t.begin());
            if(v.size()<=layer) v.push_back(vector<int> ()); 
            v[layer].push_back(tree->val);
            if(tree->left){
                l.push_back(layer+1);
                t.push_back(tree->left);
            }
            if(tree->right){
                l.push_back(layer+1);
                t.push_back(tree->right);
            }
        }
        return v;
    }
};

在评论区看到这样一种递归解法,感觉更通俗易懂一些,看了一遍自己写了一遍:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> result;
    void dg(TreeNode* tree,int layer){
        if(tree==NULL) return ;
        if(result.size()<=layer) result.push_back(vector<int> ());
        result[layer].push_back(tree->val);
        if(tree->left) dg(tree->left,layer+1);
        if(tree->right) dg(tree->right,layer+1);
    }
    vector<vector<int>> levelOrder(TreeNode* root) {
        dg(root,0);
        return result;
    }
};