代码随想录17|二叉树的层序遍历|翻转二叉树|对称二叉树

1.二叉树的层序遍历

题目:

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

复制代码
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

复制代码
输入:root = [1]
输出:[[1]]

示例 3:

复制代码
输入:root = []
输出:[]

思路:

层序遍历,顾名思义,一层层遍历,广度优先,前面是深度优先,用队列来实现

代码:

cpp 复制代码
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> que;
        if (root != NULL) que.push(root);
        vector<vector<int>> result;
        while (!que.empty()) {
            int size = que.size();
            vector<int> vec;
            // 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front();
                que.pop();
                vec.push_back(node->val);
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
            result.push_back(vec);
        }
        return result;
    }
};

2.翻转二叉树

题目:

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

复制代码
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

复制代码
输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

复制代码
输入:root = []
输出:[]

思路:

用前序遍历-递归法完成

代码:

cpp 复制代码
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (root == NULL) return root;
        swap(root->left, root->right);  // 中
        invertTree(root->left);         // 左
        invertTree(root->right);        // 右
        return root;
    }
};

三步法写完,确定递归参数和返回值,确定终止条件,确定单层递归逻辑。

3.对称二叉树

题目:

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

复制代码
输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

复制代码
输入:root = [1,2,2,null,3,null,3]
输出:false

思路:

还是用递归法,写起来简单

代码:

cpp 复制代码
class Solution {
public:
    bool compare(TreeNode* left, TreeNode* right) {
        // 首先排除空节点的情况
        if (left == NULL && right != NULL) return false;
        else if (left != NULL && right == NULL) return false;
        else if (left == NULL && right == NULL) return true;
        // 排除了空节点,再排除数值不相同的情况
        else if (left->val != right->val) return false;

        // 此时就是:左右节点都不为空,且数值相同的情况
        // 此时才做递归,做下一层的判断
        bool outside = compare(left->left, right->right);   // 左子树:左、 右子树:右
        bool inside = compare(left->right, right->left);    // 左子树:右、 右子树:左
        bool isSame = outside && inside;                    // 左子树:中、 右子树:中 (逻辑处理)
        return isSame;

    }
    bool isSymmetric(TreeNode* root) {
        if (root == NULL) return true;
        return compare(root->left, root->right);
    }
};

先排除不对称的情况,再做递归一步步判断。

相关推荐
Xの哲學1 分钟前
TCP 连接管理:深入分析四次握手与三次挥手
网络·网络协议·算法
华清远见成都中心2 小时前
基于深度学习的异常检测算法在时间序列数据中的应用
人工智能·深度学习·算法
梁辰兴4 小时前
数据结构:串、数组与广义表
开发语言·数据结构·c··数组·广义表
এ᭄画画的北北4 小时前
力扣-347.前K个高频元素
算法·leetcode
月殇_木言6 小时前
算法基础 第3章 数据结构
数据结构·算法
亮亮爱刷题7 小时前
算法提升之树上问题-(LCA)
数据结构·算法·leetcode·深度优先
火车叨位去19497 小时前
力扣top100(day03-01)--二叉树 03
算法·leetcode·职场和发展
岁忧7 小时前
(LeetCode 每日一题) 1780. 判断一个数字是否可以表示成三的幂的和 (数学、三进制数)
java·c++·算法·leetcode·职场和发展·go
浩少7028 小时前
LeetCode-16day:栈
java·数据结构·算法
胖咕噜的稞达鸭10 小时前
数据结构---关于复杂度的基础解析与梳理
c语言·数据结构·算法·leetcode