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

这篇博客详细介绍了LeetCode上的LC102和LC107两个关于二叉树层序遍历的问题。内容包括题目解读、解题思路、C++和Python的代码实现。LC102是常规的从上到下的层序遍历,而LC107则是自底向上的层序遍历。对于LC107,只需在返回结果前进行一次反转操作。
摘要由CSDN通过智能技术生成

LC102 二叉树的层序遍历

LC102
在这里插入图片描述

1.读题

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
在这里插入图片描述

2.思路

和剑指32 II 相同的题
当然也是相同的思路~
在这里插入图片描述

3.C++代码

跟剑指Offer32 II一模一样滴
又敲了一遍
在这里插入图片描述

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.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

在这里插入图片描述

LC107 二叉树的层序遍历II

LC107
在这里插入图片描述

1.读题

给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
在这里插入图片描述

2.思路

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

从下到上的!

所以C++代码中的 getResult函数完全不用动
再敲一遍~
下面的主函数中 加一步二维数组内部的“一位数组交换”即可!!
在这里插入图片描述
ps: 其实下面这个方法更加简单
在这里插入图片描述

3.C++代码

在这里插入图片描述
跟LC102没区别的好吧
return前加个
在这里插入图片描述

即可~

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.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]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值