当前位置:网站首页>LeetCode 0107.二叉树的层序遍历II - 另一种方法

LeetCode 0107.二叉树的层序遍历II - 另一种方法

2022-07-05 05:45:00 Tisfy

【LetMeFly】107.二叉树的层序遍历 II

力扣题目链接:https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

 

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

 

提示:

  • 树中节点数目在范围 [0, 2000]
  • -1000 <= Node.val <= 1000

方法一:优先队列

之前方法不同,这次决定不使用pair<TreeNode*, int>,而是直接使用TreeNode*入队。

看不懂的可以先看之前这篇博客:https://letmefly.blog.csdn.net/article/details/125584554

那么,没有了int类型的层数,怎么判断哪些节点是属于同一层的呢?

其实也很简单,我们在队列不空的时候,记录下来队列中一共由多少个元素,这些元素的个数就是当前最后一层的节点的个数。

然后,我们用一个循环,把这些元素全都添加到答案的同一层中(同时把子节点入队)即可。

  • 时间复杂度 O ( N ) O(N) O(N),其中 N N N是节点个数。
  • 空间复杂度 O ( N 2 ) O(N2) O(N2),其中 N 2 N2 N2是节点最多的一层的节点数。

AC代码

C++

class Solution {
    
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
    
        vector<vector<int>> ans;
        queue<TreeNode*> q;
        if (root)
            q.push(root);
        int layer = -1;
        while (q.size()) {
    
            ans.push_back({
    });
            layer++;
            int thisLayerNum = q.size();
            while (thisLayerNum--) {
    
                TreeNode* thisNode = q.front();
                q.pop();
                ans[layer].push_back(thisNode->val);
                if (thisNode->left)
                    q.push(thisNode->left);
                if (thisNode->right)
                    q.push(thisNode->right);
            }
        }
        reverse(ans.begin(), ans.end());  // 注意,这里是本题要求从最后一层开始遍历,所以reverse了以下。正常情况下的层次遍历是不需要reverse的
        return ans;
    }
};

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125610699

原网站

版权声明
本文为[Tisfy]所创,转载请带上原文链接,感谢
https://letmefly.blog.csdn.net/article/details/125610699