0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

解析LeetCode第226号题目:反转二叉树

jf_78858299 来源:小风算法 作者:小风算法 2023-02-17 14:52 次阅读

今天给大家讲解一道微软一面的算法题,也是LeetCode第226号题目,反转二叉树,就像这样:

图片

简单讲就是把每个节点的左子树和右子树进行交换

显然,这需要我们能够遍历该二叉树。

那么遍历二叉树就有两种经典的解法:深度优先遍历,Deep First Search,简称DFS;另一个是广度优先遍历,Breadth First Search,简称BFS。

深度优先搜索

顾名思义,深度优先搜索是我总是优先访问“ 节点的子节点的子节点 。。”,这是什么意思呢?对于给定的二叉树,我们首先访问节点4:

图片

接下来访问4的左子树2:

图片

再接下来依然访问2的左子树1:

图片

1是叶子节点,其左右子树都为空,因此返回上一个节点2,然后访问其右子树3,重复上述过程直到所有节点访问完毕。

你会发现,这其实是一个递归过程:

图片

深度优先搜索非常适合用递归代码编写。

回到这个题目,代码就可以这样写:

TreeNode* invertTree(TreeNode* root) {
    // 如果是空节点,直接访问
    if (root == nullptr) return nullptr;
    
    // 找到当前节点的左右字节点,并交换
    auto* left = root->left;
    auto* right = root->right;
    root->left = right;
    root->right = left;
    
    // 处理当前节点的左右子节点
    invertTree(left);
    invertTree(right);
    
    return root;
}

接下来我们看广度优先搜索。

广度优先搜索

个人认为广度优先搜索相对来说更容易理解,通俗的讲,广度优先搜索是“ 先把同辈访问完再访问下一辈 ”,因此这一种“ 层级 ”遍历方法,先是访问第一层,然后是第二层。。直到最后一层,就像这样:

图片

在这里我们可以使用一个队列,先把根节点4放入队列中,然后从队列依次取出节点,交换其左右字数,并将该节点的左右字数也放到队列中,重复上述过程直到队列为空,用代码就是这样实现:

TreeNode* invertTree(TreeNode* root) {
  if (root == nullptr) return nullptr;
  
  // 定义队列,并把根节点放到队列中
  queue q;
  q.push(root);
  
  while(!q.empty()) {
    // 从队列中取出节点
    auto* t = q.front();
    q.pop();

    // 交换该节点的左右子树
    auto* left = t->left;
    auto* right = t->right;
    t->left = right;
    t->right = left;
    
    // 如果该节点的左右子树不空则放到队列
    if (left) q.push(left);
    if (right) q.push(right);
  }
  return root;
}

广度优先搜索与深度优先搜索不仅仅可以用在二叉树中,这两种遍历方法有着极其广泛的用途,当我们积攒足够多的使用案例后将会系统总结这两种遍历方法。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微软
    +关注

    关注

    4

    文章

    6553

    浏览量

    103884
  • 二叉树
    +关注

    关注

    0

    文章

    74

    浏览量

    12302
  • BFS
    BFS
    +关注

    关注

    0

    文章

    9

    浏览量

    2156
收藏 人收藏

    评论

    相关推荐

    计算机二叉树的问题

    各位大神,本人马上要考计算机级了,那个二叉树老是弄不明白,比如一个题目,一棵二叉树共有25个节点,其中五个叶子节点,则度为1的节点数为?
    发表于 09-04 09:45

    基于二叉树的时序电路测试序列设计

    为了实现时序电路状态验证和故障检测,需要事先设计一个输入测试序列。基于二叉树节点和树枝的特性,建立时序电路状态二叉树,按照电路二叉树节点(状态)与树枝(输入)的层次逻辑
    发表于 07-12 13:57 0次下载
    基于<b class='flag-5'>二叉树</b>的时序电路测试序列设计

    二叉树层次遍历算法的验证

    实现二叉树的层次遍历算法,并对用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”创建的二叉树进行测试。
    发表于 11-28 01:05 2067次阅读
    <b class='flag-5'>二叉树</b>层次遍历算法的验证

    关于二叉树一些数据结构和算法相关的题目

    最近总结了一些数据结构和算法相关的题目,这是第一篇文章,关于二叉树的。
    的头像 发表于 02-07 13:57 3163次阅读

    详解电源二叉树到底是什么

    作为数据结构的基础,分很多种,像 AVL 、红黑二叉搜索....今天我想分享的是关于二叉树
    的头像 发表于 06-06 15:05 9923次阅读
    详解电源<b class='flag-5'>二叉树</b>到底是什么

    二叉树操作的相关知识和代码详解

    见的二叉树操作作个总结: 前序遍历,中序遍历,后序遍历; 层次遍历; 求的结点数; 求的叶子数; 求的深度; 求二叉树
    的头像 发表于 12-12 11:04 2003次阅读
    <b class='flag-5'>二叉树</b>操作的相关知识和代码详解

    二叉树的前序遍历非递归实现

    我们之前说了二叉树基础及二叉的几种遍历方式及练习题,今天我们来看一下二叉树的前序遍历非递归实现。 前序遍历的顺序是, 对于中的某节点,先遍历该节点,然后再遍历其左子树,最后遍历其右子
    的头像 发表于 05-28 13:59 1906次阅读

    如何才能够翻转二叉树

    有所收获! 226.翻转二叉树题目地址:https://leetcode-cn.com/problems/invert-binary-tree/ 翻转一棵
    的头像 发表于 09-01 11:45 1713次阅读

    C语言数据结构:什么是二叉树

    完全二叉树:完全二叉树是效率很高的数据结构。对于深度为K,有n个节点的二叉树,当且仅当每一个节点都与深度为K的满二叉树中编号从1至n的节点一一对应时,称为完全
    的头像 发表于 04-21 16:20 2408次阅读

    怎么就能构造成二叉树呢?

    一直跟着公众学算法的录友 应该知道,我在二叉树:构造二叉树登场!,已经讲过,只有 中序与后序 和 中序和前序 可以确定一颗唯一的二叉树。前序和后序是不能确定唯一的
    的头像 发表于 07-14 11:20 1478次阅读

    使用C语言代码实现平衡二叉树

    这篇博客主要总结平衡二叉树,所以,二叉排序树知识不会提及,但是会用到。
    的头像 发表于 09-21 11:00 1027次阅读

    二叉树的代码实现

    二叉树的主要操作有遍历,例如有先序遍历、中序遍历、后序遍历。在遍历之前,就是创建一棵二叉树,当然,还需要有删除二叉树的算法。
    的头像 发表于 01-18 10:41 1189次阅读
    <b class='flag-5'>二叉树</b>的代码实现

    C++构建并复制二叉树

    使用C++构建一个二叉树并复制、输出。
    的头像 发表于 01-10 15:17 971次阅读
    C++构建并复制<b class='flag-5'>二叉树</b>

    C++自定义二叉树并输出二叉树图形

    使用C++构建一个二叉树并输出。
    的头像 发表于 01-10 16:29 1656次阅读
    C++自定义<b class='flag-5'>二叉树</b>并输出<b class='flag-5'>二叉树</b>图形

    这么简单的二叉树算法都不会?

    这个题目leetcode572题,要求是这样的:给定两颗二叉树A和B,判断B是否是A的子树。
    的头像 发表于 08-29 11:19 800次阅读
    这么简单的<b class='flag-5'>二叉树</b>算法都不会?