【代码随想录第15天】二叉树2

102.层序遍历

题目链接:102.层序遍历
代码随想录: 102.层序遍历

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
在这里插入图片描述

迭代法

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        queue<TreeNode *> q;
        if(root) q.push(root);
        while(!q.empty()){
            int size = q.size(); // size来控制每层从左到右遍历
            vector<int> path;
            for(int i = 0; i < size; i++){ // 遍历每层
                TreeNode * cur = q.front();
                q.pop();
                path.push_back(cur -> val);
                if(cur -> left) q.push(cur -> left);
                if(cur -> right) q.push(cur -> right);
            }
            res.push_back(path);
        }
        return res;
    }
};

递归法

depth控制当前cur指针的深度(从0开始,最开始结果集size也是0)。
若depth=res.size(),说明当前res中还没有储存cur所处深度的节点,因此要为当前深度创建一个新的vector来储存当前节点。

class Solution {
public:
    void traversal(TreeNode * cur, vector<vector<int>>& res, int depth){
        if(!cur) return;
        if(res.size() == depth) res.push_back(vector<int>());
        res[depth].push_back(cur->val);
        if(cur -> left) traversal(cur->left, res, depth+1);
        if(cur->right) traversal(cur -> right, res, depth+1);
    }
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        int depth = 0;
        traversal(root, res, depth);
        return res;
    }
};

相关题目

102.二叉树的层序遍历
107.二叉树的层次遍历II
199.二叉树的右视图
637.二叉树的层平均值
429.N叉树的层序遍历
515.在每个树行中找最大值
116.填充每个节点的下一个右侧节点指针
117.填充每个节点的下一个右侧节点指针II
104.二叉树的最大深度
111.二叉树的最小深度

226.翻转二叉树(简单)

LeetCode题目:226.翻转二叉树
代码随想录:226.翻转二叉树

在这里插入图片描述
前序遍历

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if(root == nullptr) return root;
        swap(root->left, root->right);
        invertTree(root->left);
        invertTree(root->right);
        return root;
    }
};

101. 对称二叉树(简单)

LeetCode题目:101. 对称二叉树
代码随想录:101. 对称二叉树

分别比较左右子树的外侧和内侧

    // 递归法
    bool compare(TreeNode *left, TreeNode *right){
        if(!left && !right) return true; // 左右都空
        else if (left && !right )return false; // 左不空,右空
        else if (!left && right) return false; // 左空,右不空
        else if (left->val != right->val) return false; // 值不相等
        else{
            return compare(left->left, right->right) && compare(right->left, left->right);
        }
    }
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr) return true;
        return compare(root->left, root->right);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值