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

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0107.二叉树的层序遍历II - 另一种方法相关的知识,希望对你有一定的参考价值。

【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

以上是关于LeetCode 0107.二叉树的层序遍历II - 另一种方法的主要内容,如果未能解决你的问题,请参考以下文章

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

Leetcode No.107 二叉树的层序遍历 II

Leetcode刷题100天—107. 二叉树的层序遍历 II(二叉树)—day08

LeetCode第107题—二叉树的层序遍历II—Python实现

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

LeetCode JS实现 二叉树(前中后层序)遍历(递归迭代法)