day15 层序遍历 翻转二叉树 对称二叉树

这篇具有很好参考价值的文章主要介绍了day15 层序遍历 翻转二叉树 对称二叉树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目1:102 二叉树的层序遍历

题目链接:102 二叉树的层序遍历

题意

根据二叉树的根节点root,返回其节点值的层序遍历

借助队列实现,因为队列是先进先出的逻辑,符合层序遍历一层一层遍历的思想

day15 层序遍历 翻转二叉树 对称二叉树,算法,数据结构,leetcode

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> result;
        queue<TreeNode*> que;
        if(root!=NULL){
            que.push(root);
            while(!que.empty()){
                vector<int> vec;//存放每一层的结果
                int size = que.size();
                while(size--){
                    TreeNode* node = que.front();
                    que.pop();
                    if(node){
                        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:226  翻转二叉树

题目链接:226 翻转二叉树

题意

根据二叉树的根节点root,翻转二叉树,将节点是左右孩子进行翻转

注意是节点指针做交换,而不是单个数值交换

首先确定遍历顺序:前序遍历 后序遍历比较直接,中序遍历得绕一下

day15 层序遍历 翻转二叉树 对称二叉树,算法,数据结构,leetcode

递归法

递归三部曲

1)递归函数的参数和返回值

2)确定终止条件

3)确定单层递归逻辑

前序遍历

day15 层序遍历 翻转二叉树 对称二叉树,算法,数据结构,leetcode
伪代码

day15 层序遍历 翻转二叉树 对称二叉树,算法,数据结构,leetcode

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
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;
    }
};
后序遍历

day15 层序遍历 翻转二叉树 对称二叉树,算法,数据结构,leetcode

伪代码

day15 层序遍历 翻转二叉树 对称二叉树,算法,数据结构,leetcode

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        //终止条件
        if(root==NULL){
            return root;
        }
        //单层递归逻辑,后序  左右中
        invertTree(root->left);
        invertTree(root->right);
        swap(root->left,root->right);
        return root;
    }
};
中序遍历

day15 层序遍历 翻转二叉树 对称二叉树,算法,数据结构,leetcode

伪代码

day15 层序遍历 翻转二叉树 对称二叉树,算法,数据结构,leetcode

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        //终止条件
        if(root==NULL){
            return root;
        }
        //单层递归逻辑,中序  左中右
        invertTree(root->left);
        swap(root->left,root->right);
        invertTree(root->left);
        return root;
    }
};

层次遍历

将节点的左右孩子翻转一下就可以了

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        queue<TreeNode*> que;
        if(root!=NULL){
            que.push(root);
        }
        while(!que.empty()){
            int size = que.size();
            while(size--){
                TreeNode* node = que.front();
                que.pop();
                swap(node->left,node->right);
                if(node->left){
                    que.push(node->left);
                }
                if(node->right){
                    que.push(node->right);
                }
            }
        }
        return root;
    }
};

迭代法

前序遍历
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        stack<TreeNode*> st;
        if(root!=NULL){
            st.push(root);
        }
        while(!st.empty()){
            TreeNode* node = st.top();
            st.pop();
            swap(node->left,node->right);//中
            if(node->right){
                st.push(node->right);//左
            }
            if(node->left){
                st.push(node->left);//右
            }
        }
        return root;
    }
};

题目3:101 对称二叉树

题目链接:101 对称二叉树

题意

根据二叉树的根节点root,检查该二叉树是否轴对称

递归法

递归三部曲  

1)递归函数的参数和返回值  (同时遍历两棵树,根节点的左子树和根节点的右子树)

2)确定终止条件

3)确定单层递归的逻辑

day15 层序遍历 翻转二叉树 对称二叉树,算法,数据结构,leetcode代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
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 result = outside && inside;
        return result;
    }
    bool isSymmetric(TreeNode* root) {
        return compare(root->left,root->right);
    }
};

迭代法

队列

每次从队列中弹出两个元素(左子树的外侧节点与右子树的外侧节点,左子树的内侧节点与右子树的内侧节点),比较。

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        queue<TreeNode*> que;
        if(root!=NULL){
            que.push(root->left);
            que.push(root->right);
        }
        while(!que.empty()){
            TreeNode* leftnode = que.front();
            que.pop();
            TreeNode* rightnode = que.front();
            que.pop();
            if(leftnode==NULL && rightnode==NULL) continue;//遍历到叶子节点的下一层
            else if(leftnode!=NULL && rightnode==NULL) return false;
            else if(leftnode==NULL && rightnode!=NULL) return false;
            else if(leftnode->val!=rightnode->val) return false;
            else{
                que.push(leftnode->left);//外侧节点
                que.push(rightnode->right);//外侧节点
                que.push(leftnode->right);//内侧节点
                que.push(rightnode->left);//内侧节点
            }
        }
        return true;
    }
};
反例

为啥是continue 不是return true?

day15 层序遍历 翻转二叉树 对称二叉树,算法,数据结构,leetcode

和队列的流程一模一样,只不过是换了一个容器而已

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        stack<TreeNode*> st;
        if(root!=NULL){
            st.push(root->left);
            st.push(root->right);
        }
        while(!st.empty()){
            TreeNode* rightnode = st.top();
            st.pop();
            TreeNode* leftnode = st.top();
            st.pop();
            if(rightnode==NULL && leftnode==NULL) continue;
            else if(rightnode==NULL && leftnode!=NULL) return false;
            else if(rightnode!=NULL && leftnode==NULL) return false;
            else if(rightnode->val!=leftnode->val) return false;
            else{
                st.push(leftnode->left);//外侧节点
                st.push(rightnode->right);//外侧节点
                st.push(leftnode->right);//内侧节点
                st.push(rightnode->left);//内侧节点
            }
        }
        return true;
    }
};
反例

为啥是continue 不是return true?

day15 层序遍历 翻转二叉树 对称二叉树,算法,数据结构,leetcode文章来源地址https://www.toymoban.com/news/detail-813966.html

到了这里,关于day15 层序遍历 翻转二叉树 对称二叉树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录Day12 二叉树 LeetCode T102二叉树的层序遍历 T226 翻转二叉树 T101 对称二叉树

    本文思路和详细讲解来自于:代码随想录 (programmercarl.com) 题目链接:102. 二叉树的层序遍历 - 力扣(LeetCode) 本题使用队列辅助完成,讲解主要函数CheckOrder:首先判断root是否为空,是就直接返回,然后创建队列,向里加入root元素,计算队列的长度,也就是每一层的元素个数,while循环,si

    2024年02月06日
    浏览(33)
  • 【leetcode100-038/039/040/041】【二叉树】翻转/对称/直径/层序遍历

    今天看题目真的太简单了,干脆一起写了。 【二叉树翻转】 给你一棵二叉树的根节点  root  ,翻转这棵二叉树,并返回其根节点。 思路: 先交换左右子节点,再递归处理左右子树(或者反过来也行)。 【镜像二叉树】 给你一个二叉树的根节点  root  , 检查它是否轴对称

    2024年01月19日
    浏览(52)
  • 【数据结构与算法】力扣:二叉树的层序遍历

    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例1: 输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2: 输入:root = [1] 输出:[[1]] 示例 3: 输入:root = [] 输出:[] 来源:力扣(LeetCode) 链接:https://leetcode.cn/p

    2024年02月13日
    浏览(36)
  • LeetCode 0103.二叉树的锯齿形层序遍历:层序遍历 + 适时翻转

    力扣题目链接:https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal/ 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。   示例 1: 示例 2: 示例 3:   提示: 树中节点数目在范

    2024年02月20日
    浏览(30)
  • 二叉树(下)+Leetcode每日一题——“数据结构与算法”“对称二叉树”“另一棵树的子树”“二叉树的前中后序遍历”

    各位CSDN的uu们你们好呀,今天小雅兰的内容仍然是二叉树和Leetcode每日一题,下面,就让我们进入二叉树的世界吧!!! 这个题目需要重新定义一个函数,函数参数需要有左子树和右子树,题目所给定的函数无法解决问题。 每个不为空的结点,都可以认为是一棵子树的根 

    2024年02月16日
    浏览(33)
  • 代码随想录day13 | 226.翻转二叉树 101.对称二叉树

    使用前、后序反转最为方便。 为啥不推荐中序? 中序遍历,某些节点的左右孩子会翻转两次,某些节点左右孩子不会被反转。 101.对称二叉树 关键在于,看这个节点对应的左子树和右子树是否可以相互反转。 1、如何比较呢? 比较的是两个子树的里侧和外侧的元素是否相等

    2024年02月15日
    浏览(29)
  • day-20 二叉树的层序遍历

    思路:利用队列进行广度优先遍历即可 注意点:ArrayList执行remove之后,索引i会立即重排,注意可能越界 code:

    2024年03月19日
    浏览(38)
  • 数据结构——二叉树层序遍历

    来喽来喽~ 二叉树的层序遍历来喽~ 层序遍历那是相当有趣滴! 我的朋友,请不要迷惘,你要记住,你终有鲲鹏一日! 加油吧!从现在开始~ 层序遍历 :除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所

    2024年02月07日
    浏览(37)
  • 【数据结构】二叉树的层序遍历

    当我们面对一个树结构时,常常需要对其进行遍历以获取其中的节点信息。其中一种常用的遍历方式是层序遍历,也称为广度优先搜索(BFS)。本篇博客将详细介绍层序遍历的原理和实现方法。 层序遍历以树的根节点开始,按照从上到下、从左到右的顺序逐层遍历树中的节点

    2024年02月03日
    浏览(33)
  • 【C语言/数据结构】二叉树(层序遍历|判断完全二叉树|性质)

     🌈个人主页: 秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏: 《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm=1001.2014.3001.5482 ​ ​​​ 目录  层序遍历  层序遍历函数实现 判断二叉树是否为完全二叉树 二叉树性质        💬 hello! 各位铁子们大

    2024年01月24日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包