开始刷二叉树
Posted Python与算法社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开始刷二叉树相关的知识,希望对你有一定的参考价值。
存在即合理,经典数据结构二叉树存在的价值又是什么?它相关的基础概念都有哪些?今天这篇文章带你解决这两个问题。
-
二叉树与一维的、线性的数组、链表等数据结构有何不同?它的价值是什么?
数组是一组连续的内存空间,大小事先指定;每个空间只存储数据。
二叉树的节点相比于链表节点,多了一个指针,其两个指针一个指向左子节点,一个指向右子节点。如下为二叉树:
二叉树是典型的非线性数据结构,在实际中,有很多逻辑关系并不是简单的线性关系,常常存在一对多,甚至多对多的情况。比如我们家庭成员之间的关系、企业中职级关系。因此需要像二叉树这种非线性数据结构来表示。
二叉树的优点,也可能最大的价值所在:在平衡的情况下,可以保证对二叉树的查找和插入都是 的时间复杂度。这很了不起。
参考下面的例子:
假设要获取关键码在0到5000之间的所有元素。实际上,只有一个这样的元素,10000个其他键不在此范围内的元素。二叉树可以有效地进行范围搜索,因为它不搜索不可能获得答案的子树。如果选用数组和哈希表,它们的时间复杂度都为
二叉树的缺点:二叉树有可能直接退化为如下的一个单链表,即只有一条从根节点到叶节点的路径:
除此之外,如果要使用二叉树存储同样的信息,每个二叉树节点都需要额外的保存两个指针值。
-
写出二叉树的以下概念:路径、根、父节点、孩子、叶结点、子树、访问、遍历、层级和关键码。
路径:从根节点到叶节点所经过的节点和边组成一条路径,如上图从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天总结》这篇文章:
长按二维码,查看算法刷题日记星球
以上是关于开始刷二叉树的主要内容,如果未能解决你的问题,请参考以下文章
算法漫游指北(第十三篇):二叉树的基本概念满二叉树完全二叉树二叉树性质二叉搜索树二叉树定义二叉树的广度优先遍历