二叉树
树
树是一种数据结构,它是由 n(n>=1)个有限节点组成一个具有层次关系的集合。

- 树的特点:
- 每个节点有零个或多个子节点
- 没有父节点的节点称为根节点
- 每一个非根节点有且只有一个父节点
- 除了根节点外,每个子节点可以分为多个不相交的子树
- 树的术语:
结点的度
:结点拥有的子树的数目。叶子
:度为零的结点。分支结点
:度不为零的结点。树的度
:树中结点的最大的度。层次
:根结点的层次为 1,其余结点的层次等于该结点的双亲结点的层次加 1。树的高度
:树中结点的最大层次。无序树
:如果树中结点的各子树之间的次序是不重要的,可以交换位置。有序树
:如果树中结点的各子树之间的次序是重要的,不可以交换位置。森林
:0 个或多个不相交的树组成。对森林加上一个根,森林即成为树;删去根,树即成为森林。
二叉树
每个节点最多有两个子树的树结构
- 五种基本形态:
- 跟和左右子树
- 二叉树可以是空集
- 根可以有空的左子树
- 根可以有空的右子树
- 左、右子树皆为空
<img src=“http://qny.zhengxingtao.com/media/images/BST_2.jpg”/ style=“max-width: 93%;”>
- 二叉树有以下几个性质:
- 二叉树第 i 层上的结点数目最多为 2 {i-1} (i≥1)。
- 深度为 k 的二叉树至多有 2 {k}-1 个结点 (k≥1)。
- 包含 n 个结点的二叉树的高度至少为 log2 (n+1)。
- 在任意一棵二叉树中,若终端结点的个数为 n0,度为 2 的结点数为 n2,则 n0=n2+1
案例
给定一个二叉树,判断其是否是一个有效的二叉搜索树
- 一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数
- 节点的右子树只包含大于当前节点的数
- 所有左子树和右子树自身必须也是二叉搜索树
递归
之前我对于需要重复使用的一个方法,总是使用回调的方式处理,而算法有种类似的处理方式–递归
递归就是在函数内部调用自己的函数被称之为递归
个人感觉
递归就像是套娃
- 递归的特点:
- 必须有一个明确的结束条件
- 每次进入更深一层递归时,问题规模 (计算量) 相比上次递归都应有所减少
- 递归效率不高,递归层次过多会导致栈溢出
在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出
递归与非递归的对比
二分法
给定一个有序列表,获取其索引
index()
直接使用 index 获取,如果
i
比较靠前,那么遍历列表的次数还可以接受
但是如果列表很长,同时 i 也在最后,这时的遍历就很费事了 (
时间复杂度
)
可变类型
列表是可变类型
我们遍历列表的同时队列表进行操作,第二次遍历的时候,列表会变成我们操作后的列表
二分法
二分法可以减少很多的比较次数

评论区