对于树这类题目,其实并不研究复杂的树,只研究最简单的二叉树,所谓二叉树就是指每个结点最多有2个子节点,可以只有一个子节点或者没有子节点(只要让不存在的结点为null即可),每个结点TreeNode除了有子节点之外还有一个数值,通常数值是int类型的数,即树有树结点构成,每个结点是一个TreeNode对象,结点对象中包含对2个子节点的引用以及一个int类型的值。二叉树问题并不难,通链表一样主要也是对指针的使用,只是二叉树的使用范围更广,场景、变化更多;因此要多理解,多练习,学会举一反三。

注意:二叉树不同于堆(堆是特殊的二叉树—完全二叉树),只有完全二叉树才与数组相对应,才可以使用i、2*i、2*i+1来建立父节点与子节点之间的位置关系。

视频讲解:

二叉树是由结点通过引用构成的,二叉树结点的结构是int value用来表示这个结点的值,以及Node left和Node right用来表示这个结点的2个子节点的引用对象。在Node类中通常还有一个构造函数,用来给新创建的结点赋值,注意只是给value属性赋值,left和right不赋值,默认是null。在新创建数的结点时需要Node node=new Node(123);并且通过设置left、right来设置这个结点的左右子节点;通过将某个结点的left或者right赋值为node来将结点node连接到已有的父节点上。注意,在二叉树中,任何一个结点只有一个父节点,即只会被引用一次;任何一个几点最多有2个子节点,即最多可以引用2个子节点。

二叉树类型题目是面试常考题型

1.二叉树能够结合队列、栈、链表、字符串等很多数据结构来进行考察

2.二叉树是一种特殊的图,使用二叉树时需要掌握图的基本遍历方式,例如广度优先搜索算法(Breadth First Search--BFS)和深度优先搜索算法(Deepth First Search--DFS)

3.二叉树题目需要掌握递归函数的使用并自己设计出递归过程。二叉树本身就是一种高度重复的结构(每棵树都有子树构成,子树又是一个树又由子树构成,对一棵树的某种操作需要对该树的子树以及子子树进行相同的操作),于是在对树进行操作时经常会用到递归来对子树以及子子树进行相同的操作。要灵活应用递归,掌握边界停止条件和每次的返回值。

4.树在实际工作中有广泛的使用,练好树的题目对于工作也是很有用的。

二叉树是一种特殊的树,相对树和图来讲结构很简单清晰,关键是对二叉树的先序、中序、后序遍历过程要熟练掌握并且明白二叉树在每种遍历顺序下有什么特点(例如先序遍历下第一个数是根结点,后序遍历下最后一个结点是根结点等)。

二叉树的先序遍历、中序遍历、后序遍历

一棵树上面有很多结点,在很多时候都要对树上的所有结点进行遍历(例如找出最小的结点,判断是否对称,按层打印所有结点,找出最大子搜索树等),因此必然要求对二叉树进行扫描遍历,遍历有很多种顺序,任意顺序都可以,但是通常最常用的是3中遍历方式,即先序遍历,中序遍历、后序遍历。这3中遍历方式究竟是什么原理呢?它们都是按照从大到小,从整到零的思想来遍历的,我们知道树的结点的基本结构就3部分:结点自身、左子树以及右子树。因此遍历时无非就是要遍历某个结点、该结点的左结点、该结点的右结点。而该结点的子节点又是一棵树的根结点,有其左结点和右结点,那么对于层出不穷的结点究竟如何遍历呢?我们规定了3中遍历顺序,注意是规定了3中遍历顺序,没有什么理由。

所谓先序遍历就是指先访问根结点,再访问左结点,再访问右结点。注意,这里的访问顺序是对树中的任意子树都成立的,即对于任意子树,都要先访问根结点,再访问左结点和右结点。注意理解:遍历时总是从根结点开始逐个访问(访问到某个结点并不代表遍历到了这个结点),不管是先序、中序、后序,总是从根结点开始,如果是先序就先打印①,再去访问②③;如果是中序,虽然是先打印②再打印①,但是访问时还是先访问①,然后按照遍历顺序先去遍历它的左结点②,再遍历结点①。

对于上图中的二叉树,如果是先序遍历,那么先输出结点①,然后遍历左子树②再遍历右子树③,在遍历左子树时,由于结点②本身是子树的根结点,它又有子结点,因此按照定义(对于任意子树,都要先遍历根结点,再遍历其左结点和右结点),如果一个结点有子树,那么要先遍历完这个结点的子树之后才代表遍历完了这个结点,才能够继续遍历右子树,即所谓的先序遍历是指:先遍历根结点,再遍历根结点的左子树,再遍历根结点的右子树。即是遍历左右子树而不是左右结点,于是在遍历某个子树时,也要先遍历它的根结点(注意是结点),再遍历它的左子树(注意是子树)、再遍历它的右子树(注意是子树)。

同理对于中序遍历,对于当前访问到的结点,先遍历左子树(注意是子树),一直向下访问结点的左子树,当结点的左子树为null即没有左子树了时输出这个结点,即当左子树为null时遍历该子树根结点(注意是结点),然后访问该结点的右子树(注意是子树)。注意任何时候当访问的子树为null时表示没有子树了,就return。

同理对于后序遍历,访问总是从根结点开始,先遍历左子树(注意是子树),如果子树根结点又有子树那么就继续向下访问左子树,直到左子树为null,访问对应的右子树,同理还要向下访问左子树、右子树、当左子树右子树都为null时遍历null的根结点,表示该结点对应的子树遍历完成,之后return到上一层,遍历上一层的右子树,以此类推。

对于二叉树的遍历,只需要理解对于每一个子树的遍历顺序(根结点+左子树+右子树;左子树+根结点+右子树;左子树+右子树+根结点),即只需要理解在一个子树中的遍历顺序即可,在一个子树中确定遍历的return条件、递归方法调用顺序即可,然后使用递归来对整棵树进行递归遍历即可,千万不要按照递归展开后的顺序去理解二叉树的遍历,那样会很复杂很痛苦。即弄好一个循环单元,然后以此循环单元进行循环或者递归即可。

先序遍历:对于二叉树中的任意子树,都是先遍历子树的根结点,再遍历子树的左子树和右子树,因此当把二叉树按照先序遍历的顺序存放到字符串或者数组中之后,数组的第一个元素必然是根元素,除此之外不能给出更多的信息了。

中序遍历:对于二叉树中的任意子树,都是先遍历根结点的左子树,再遍历根结点,再遍历根结点的右子树,因此当把二叉树按照中序遍历的顺序存放到数组或者字符串中之后,如果已知根结点再数组中的位置i,那么在i左边的元素都是其左子树上的结点;在i右边的元素都是其右树上的结点。

后序遍历:对于二叉树中的任意子树,都是先遍历根结点的左子树,再遍历根结点的右子树,再遍历根结点,因此当把二叉树按照后序遍历的顺序存放到字符串或者数组中时,数组最后的一个元素必然就是二叉树的根结点,除此之外无法提供更多信息了。

二叉树:二叉树视频笔记相关推荐

  1. 算法【二叉树】学习笔记 - 已知结点数计算可构建出多少种二叉树

    算法[二叉树]学习笔记 - 已知结点数计算可构建出多少种二叉树 卡特兰数 相关知识点 排列组合公式 排列 Arrangement 组合 Combination 分步计算 简化 参考资料 题目:已知3个 ...

  2. 虚幻4视频笔记002:精简StarterContent文件夹体积

    #虚幻4#视频笔记:精简StarterContent文件夹体积 . 在很多练习项目和测试项目中,都会使用StarterContent文件夹,但是该文件夹体积巨大,如果项目数量多会占用大量空间,并且分享 ...

  3. ng机器学习视频笔记(二) ——梯度下降算法解释以及求解θ

    ng机器学习视频笔记(二) --梯度下降算法解释以及求解θ (转载请附上本文链接--linhxx)   一.解释梯度算法 梯度算法公式以及简化的代价函数图,如上图所示. 1)偏导数 由上图可知,在a点 ...

  4. ng机器学习视频笔记(十四) ——推荐系统基础理论

    ng机器学习视频笔记(十三) --推荐系统基础理论 (转载请附上本文链接--linhxx) 一.概述 推荐系统(recommender system),作为机器学习的应用之一,在各大app中都有应用. ...

  5. 红橙Darren视频笔记 UML图简介

    整体架构复制自红橙原视频的课堂笔记 因为他这一课没有博客,所以没有转载链接,CSDN没有转载地址是无法作为转载类型的文章发表的,暂时标记为原创 参考链接 https://blog.csdn.net/r ...

  6. 红橙Darren视频笔记 代理模式 动态代理和静态代理

    红橙Darren视频笔记 代理模式 动态代理和静态代理(Android API 25) 关于代理模式我之前有过相关的介绍: https://blog.csdn.net/u011109881/artic ...

  7. 红橙Darren视频笔记 类加载机制(API28) 自己写个热修复 查看源码网站

    第一部分 类加载机制 一个Activity是如何被Android虚拟机找到的? 在之前的文章 红橙Darren视频笔记 自定义View总集篇(https://blog.csdn.net/u011109 ...

  8. 红橙Darren视频笔记 利用阿里巴巴AndFix进行热修复

    注意 由于AndFix在2017年左右就停止更新了,在最新版本的apk上遇到很多问题,我最终也没有成功进行热修复.本节主要是学习热修复的原理 在上一篇 红橙Darren视频笔记 自己捕获异常并保存到本 ...

  9. 红橙Darren视频笔记 Behavior的工作原理源码分析

    主要coordinatorlayout的代码来自coordinatorlayout-1.0.0-sources.jar 本文从源码介绍 CoordinatorLayout 的 behavior 怎么工 ...

  10. 红橙Darren视频笔记 仿QQ侧滑效果

    这一篇没有什么新的内容 就是改写 红橙Darren视频笔记 仿酷狗侧滑效果 的侧滑的效果 1.去掉淡入淡出效果 2.加上黑色模板效果 效果: 去掉淡入淡出效果很简单 就是注释掉onScrollChan ...

最新文章

  1. 那个大战AlphaGo的柯洁,将免试入读清华大学工商管理专业
  2. 科大星云诗社动态20210517
  3. jqMobi + Android 试手
  4. 在 Laravel 应用中使用 pjax 进行页面加速
  5. ubuntu 20.04双系统安装_win10上跑Ubuntu不用虚拟机不用双系统!
  6. java8 Lambda Stream collect Collectors 常用实例
  7. 怎样选择宽带上网产品--解读上海电信政企宽带新套餐
  8. 在输入文本框中获取值
  9. Selenium爬虫 -- 用户动态数据爬取
  10. 如何csdn复制他人博客文章到自己博客下?
  11. emlog rss.php,[emlog]boblog数据转到emlog
  12. SP商BI平台(MP子平台)——通信增值业务运营SP公司
  13. 一款好用的WEB版报表工具、报表设计器
  14. P1427 小鱼的数字游戏——栈的初次会面
  15. 幻方解法之horse法生成奇阶幻方
  16. Sql Server 生成 Word 文档 表结构
  17. 我用kafka两年踩过的一些非比寻常的坑(宝贵经验)
  18. Nature Gradient 自然梯度
  19. 机器学习项目中遇到的难题_现代难题:何时使用规则与机器学习
  20. python玩转emoji ????(微信又“偷偷”更新了这个表情)

热门文章

  1. oracle11g 企业管理器无法登陆
  2. 打破传统桎梏,挑战性能巅峰,网友:这轻薄本性能强的像游戏本
  3. 个人对东西方人开放的拙见。
  4. 玖益科技:商品详情页的提升方法
  5. Vue vben admin - 新鲜出炉的高颜值管理后台UI框架,基于 Vue3 和 Ant Design Vue
  6. 电源管理芯片TMI6201A,助力电池供电系统超长续航更有价值!
  7. 云讯健身管理系统-9
  8. android 取imei p10,华为p10如何解锁BootLoader 华为p10解锁BootLoader图文教程
  9. 简易的单点登录系统代码实现
  10. 在bandwagon上架设web服务器