4-5 LC102 107 二叉树的层序遍历I II C++ python力扣刷题笔记

文章目录

  • LC102 二叉树的层序遍历
    • 1.读题
    • 2.思路
    • 3.C++代码
    • 4.python代码
  • LC107 二叉树的层序遍历II
    • 1.读题
    • 2.思路
    • 3.C++代码
    • 4.python代码

LC102 二叉树的层序遍历

LC102
在这里插入图片描述

1.读题

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
4-5 LC102 107 二叉树的层序遍历I II C++ python力扣刷题笔记_第1张图片

2.思路

和剑指32 II 相同的题
当然也是相同的思路~
4-5 LC102 107 二叉树的层序遍历I II C++ python力扣刷题笔记_第2张图片

3.C++代码

跟剑指Offer32 II一模一样滴
又敲了一遍
4-5 LC102 107 二叉树的层序遍历I II C++ python力扣刷题笔记_第3张图片

class Solution {
     
public:
    void getResult(TreeNode *root, int depth, vector<vector<int>> &ans){
     //深度优先搜索
        //这个是用于每一层打印结果的函数
	    if (root == NULL) return;//特例处理
	    if (depth == ans.size()) {
      //在当前层数与最终结果(二维动态)数组的长度相同时
            ans.push_back(vector<int>());//新建一行~
            //在二维数组没有对应”行“的时候 新建这一“行”————就这作用~
        }
	    ans[depth].push_back(root->val);//向结果数组的尾部中加入根节点
	    getResult(root->left, depth+1, ans);//逐层进行递归 
	    getResult(root->right,depth+1, ans);
        return;
        }
    vector<vector<int>> levelOrder(TreeNode* root) {
     
        vector<vector<int>> ans;
        getResult(root, 0, ans);//从第零层开始遍历
        return ans;
    }
};

4-5 LC102 107 二叉树的层序遍历I II C++ python力扣刷题笔记_第4张图片

4.python代码

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root: return [] #特例处理
        res, queue = [], collections.deque() #初始化队列
        queue.append(root) #把根压入队列
        while queue: #队列只要不为空 就一直循环
            tmp = [] #初始化临时列表
            for _ in range(len(queue)): #当前层打印循环
                node = queue.popleft() #队首元素出队 记为node 因为是双向队列 所以从左边出!
                tmp.append(node.val) #将node加到结果列表中
                if node.left: queue.append(node.left) #左子节点如果非空 加入队列末尾
                if node.right: queue.append(node.right) #右子节点如果非空 加入队列末尾
            res.append(tmp) #将这一层的结果打印出来 加到最后的二维结果数组中~
        return res

4-5 LC102 107 二叉树的层序遍历I II C++ python力扣刷题笔记_第5张图片

LC107 二叉树的层序遍历II

LC107
在这里插入图片描述

1.读题

给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
4-5 LC102 107 二叉树的层序遍历I II C++ python力扣刷题笔记_第6张图片

2.思路

与上面的唯一不同——
这个层序遍历是

从下到上的!

所以C++代码中的 getResult函数完全不用动
再敲一遍~
下面的主函数中 加一步二维数组内部的“一位数组交换”即可!!
4-5 LC102 107 二叉树的层序遍历I II C++ python力扣刷题笔记_第7张图片
ps: 其实下面这个方法更加简单
在这里插入图片描述

3.C++代码

4-5 LC102 107 二叉树的层序遍历I II C++ python力扣刷题笔记_第8张图片
跟LC102没区别的好吧
return前加个
4-5 LC102 107 二叉树的层序遍历I II C++ python力扣刷题笔记_第9张图片

即可~

class Solution {
     
public:
    void getResult(TreeNode *root, int depth, vector<vector<int>> &ans){
     
	    if (root == NULL){
     
            return;
        }
        if(depth == ans.size()){
     
            ans.push_back(vector<int>());
        }
        ans[depth].push_back(root->val);
        getResult(root->left, depth+1, ans);
        getResult(root->right, depth+1, ans);
        return;
    }   
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
     
        vector<vector<int>> ans;
        getResult(root, 0, ans);//先常规从上到下打印出来二维数组
        reverse(ans.begin(),ans.end());
        return ans;
    }
};

4-5 LC102 107 二叉树的层序遍历I II C++ python力扣刷题笔记_第10张图片

4.python代码

跟LC102没区别的好吧

return ans[::-1]即可~

class Solution:
    def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:
        if not root: return [];
        ans,queue=[],collections.deque()
        queue.append(root)
        while queue:
            tmp = []
            for _  in range(len(queue)):
                node = queue.popleft()#队首元素出队 因为是双向队列 所以从左边出!
                tmp.append(node.val)
                if node.left: queue.append(node.left)
                if node.right: queue.append(node.right)
            ans.append(tmp)
        return ans[::-1]

你可能感兴趣的:(一个菜鸡的力扣刷题之路,二叉树,队列,算法,leetcode,数据结构)