day15打卡

news/2024/7/20 22:15:54 标签: 深度优先, 算法, leetcode

day15打卡

226. 翻转二叉树

递归解法:

时间复杂度:O(N),空间复杂度:O(N)

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

迭代解法:

  • 方法一

掌握迭代法遍历二叉树即可

时间复杂度:O(N),空间复杂度:O(N)

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if(root == nullptr) return root;
        stack<TreeNode*> st;
        st.push(root);
        while(!st.empty())
        {
            TreeNode* cur = st.top();
            st.pop();
            swap(cur->left, cur->right);
            if(cur->right != nullptr) st.push(cur->right);//左节点交换到了右边
            if(cur->left != nullptr) st.push(cur->left);//反转顺序无所谓
        }
        return root;
    }
};
  • 方法二

层序遍历

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if(root == nullptr) return root;
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty())
        {
            for(int i = 0; i < q.size(); i++)//遍历完本层节点后才会进入下一层节点
            {
                TreeNode* top = q.front();
                q.pop();
                swap(top->left, top->right);
                if(top->left) q.push(top->left);
                if(top->right) q.push(top->right);
            }
        }
        return root;
    }
};

101. 对称二叉树

递归解法:

时间复杂度:O(N),空间复杂度:O(N)

class Solution {
public:
    bool dfs(TreeNode* left, TreeNode* right)
    {
        //先判断左右节点
        if(left == nullptr && right != nullptr) return false;
        else if(left != nullptr && right == nullptr) return false;
        else if(left == nullptr && right == nullptr) return true;
        else if(left->val != right->val) return false;
        //再进行递归:保证对称
        bool Left = dfs(left->left, right->right);
        bool Right = dfs(left->right, right->left); 
        return Left && Right;
    }
    bool isSymmetric(TreeNode* root) {
        return dfs(root->left, root->right);
    }
};

迭代解法:

时间复杂度:O(N),空间复杂度:O(N)

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr) return true;
        stack<TreeNode*> st;
        st.push(root->left);
        st.push(root->right);
        while(!st.empty())
        {
            TreeNode* right = st.top();
            st.pop();
            TreeNode* left = st.top();
            st.pop();
            if(!left && !right) continue;
            if(!left || !right || (left->val != right->val)) return false;
            st.push(left->left);
            st.push(right->right);
            st.push(left->right);
            st.push(right->left);
        }
        return true;
    }
};
  • 队列
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr) return true;
        queue<TreeNode*> q;
        q.push(root->left);
        q.push(root->right);
        while(!q.empty())
        {
            TreeNode* left = q.front();
            q.pop();
            TreeNode* right = q.front();
            q.pop();
            //如果都为空则为true,跳过此次循环
            if(!left && !right) continue;
            //如果一个为空或者节点中数字不同,就直接返回false
            if(!left || !right || (left->val != right->val)) return false;
            //进入下一层节点判断
            q.push(left->left);
            q.push(right->right);
            q.push(left->right);
            q.push(right->left);

        }
        //遍历到最后返回true
        return true;
    }
};

http://www.niftyadmin.cn/n/5343966.html

相关文章

Web07--JavaScript基础03

1、事件绑定 Event 对象 Event 对象代表事件的状态&#xff0c;比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。 事件通常与函数结合使用&#xff0c;函数不会在事件发生前被执行&#xff01; 1.1 常用的事件 点击事件 事件 描述 onclick 单击…

【解决方法】pdf密码忘了怎么办?

PDF文件可以加密&#xff0c;大家都不陌生&#xff0c;并且大家应该也都知道PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和offi…

i18n多国语言Internationalization的动态实现

一、数据动态的更新 在上一篇i18n多国语言Internationalization的实现-CSDN博客&#xff0c;可能会遇到一个问题&#xff0c;我们在进行英文或中文切换时&#xff0c;并没有办法对当前的数据进行动态的更新。指的是什么意思呢&#xff1f;当前app.js当中一个组件内容&#xff…

CodeReview 小工具

大家开发中有没有遇到一个版本开发的非常杂&#xff0c;开发很多个项目&#xff0c;改动几周后甚至已经忘了自己改了些什么&#xff0c;领导要对代码review的时候&#xff0c;理不清楚自己改过的代码&#xff0c;只能将主要改动的大功能过一遍。这样就很容易造成review遗漏&…

C++——结构体

1&#xff0c;结构体基本概念 结构体属于用户自定义的数据类型&#xff0c;允许用户存储不同的数据类型。像int&#xff08;整型&#xff09;&#xff0c;浮点型&#xff0c;bool型&#xff0c;字符串型等都是属于系统内置的数据类型。而今天要学习的结构体则是属于我们自定义…

行内样式css不生效

场景&#xff1a; 别人的代码里有样式是写在行内的&#xff0c;且设置了display:block&#xff1b;没有生效&#xff0c;也没有被覆盖样式&#xff0c;很奇怪。 <span style"width:90px;display:block;">很多字&#xff0c;style也很长&#xff0c;中间换行了…

ORM-02-JPA Java Persistence API 注解入门介绍

拓展阅读 The jdbc pool for java.(java 手写 jdbc 数据库连接池实现) The simple mybatis.&#xff08;手写简易版 mybatis&#xff09; JPA JPA是Java Persistence API的简称&#xff0c;中文名Java持久层API&#xff0c;是JDK 5.0注解或XML描述对象&#xff0d;关系表的映射…

【立创EDA-PCB设计基础完结】7.DRC设计规则检查+优化与丝印调整+打样与PCB生产进度跟踪

前言&#xff1a;本文为PCB设计基础的最后一讲&#xff0c;在本专栏中【立创EDA-PCB设计基础】前面已经将所有网络布线铺铜好了&#xff0c;接下来进行DRC设计规则检查优化与丝印调整打样与PCB生产进度跟踪 目录 1.DRC设计规则检查 2.优化与丝印调整 1.过孔连接优化 2.泪滴…