开始刷二叉树

存在即合理,经典数据结构二叉树存在的价值又是什么?它相关的基础概念都有哪些?今天这篇文章带你解决这两个问题。

  1. 二叉树与一维的、线性的数组、链表等数据结构有何不同?它的价值是什么?

数组是一组连续的内存空间,大小事先指定;每个空间只存储数据。

链表中的每个节点除了存储数据,还有指向下一个节点地址的指针,所以它可以是非连续的内存空间。如下是一个链表:

二叉树的节点相比于链表节点,多了一个指针,其两个指针一个指向左子节点,一个指向右子节点。如下为二叉树:


二叉树是典型的非线性数据结构,在实际中,有很多逻辑关系并不是简单的线性关系,常常存在一对多,甚至多对多的情况。比如我们家庭成员之间的关系、企业中职级关系。因此需要像二叉树这种非线性数据结构来表示

二叉树的优点,也可能最大的价值所在:在平衡的情况下,可以保证对二叉树的查找和插入都是 的时间复杂度。这很了不起。

参考下面的例子:

假设要获取关键码在0到5000之间的所有元素。实际上,只有一个这样的元素,10000个其他键不在此范围内的元素。二叉树可以有效地进行范围搜索,因为它不搜索不可能获得答案的子树。如果选用数组和哈希表,它们的时间复杂度都为

二叉树的缺点:二叉树有可能直接退化为如下的一个单链表,即只有一条从根节点到叶节点的路径:

除此之外,如果要使用二叉树存储同样的信息,每个二叉树节点都需要额外的保存两个指针值。

  1. 写出二叉树的以下概念:路径、根、父节点、孩子、叶结点、子树、访问、遍历、层级和关键码。

路径:从根节点到叶节点所经过的节点和边组成一条路径,如上图从70->49->37->22就是一条路径;

根:二叉树的顶点,也就是二叉树顶部的那个节点,70是上图二叉树的根;

父节点:和子节点相对,左右子节点的上一个节点,49是37和54节点的父节点;

孩子:也即左右子节点;37和54是49的孩子节点;

叶节点:无孩子节点的节点;22,44,54都是叶节点;

子树:子节点及其包含的所有节点所组成的树;49节点和其包含的所有节点组成一个子树;

访问:读取树节点的值

遍历:读取树所有节点的值,一般有前序、中序、后序、按层遍历。

遍历的动画可参考:

https://opendsa-server.cs.vt.edu/ODSA/Books/Everything/html/BinaryTreeTraversal.html

前序遍历结果

层级:高度加1等于层数,也就是从根节点到该节点经过的节点数

关键码:节点的值被称为关键码

3二叉树相关的问题

二叉树是一维链表的升华,所以链表的一些使用技巧和思想可以借鉴到二叉树中。有关二叉树的常见问题包括:

  • 求二叉树深度

  • 二叉树遍历

  • 二叉树的合并

  • 二叉树的镜像

  • 翻转二叉树

  • 二叉树的坡度

  • 二叉树是否对称

  • 二叉树的直径

  • 二叉树是否平衡

  • 二叉树剪枝

  • 完全二叉树插入器

  • 二叉树完全性检验

  • 二叉树着色游戏

  • 判断二分图

  • ......

接下来的1个多月,我们将会在星球里一起开刷二叉树,完成关于二叉树的leetcode题目。程序员面试类,尤其是算法类面试,几乎都会考算法题,如果你也有这方面的需要和爱好,欢迎加入。了解星球更多,请点击了下方《算法刷题45天总结》这篇文章:

算法刷题 45 天总结

长按二维码,查看算法刷题日记星球

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值