我不是罗大锤我不是罗大锤

我不是罗大锤

我不是罗大锤我不是罗大锤

我不是罗大锤

首页首页
分类分类
标签标签
友情链接友情
日记日记

二叉树基础理论

&算法#二叉树

允许评论

5 个月前

下面记录一下二叉树的一些简单常用理论。

一、种类

1. 满二叉树

  • 节点数量:2^k - 1(k 是深度,从头 1 开始)
满二叉树

2. 完全二叉树

除了底层以外,其他层都是满的。底层不一定满,节点从左到右连续。

满二叉树一定是完全二叉树。

堆其实就是完全二叉树。

完全二叉树

3. 二叉搜索树

对节点结构没有要求,但是对节点上的元素有顺序要求。

左子树所有节点都小于中间节点,右子树所有节点都大于中间节点。

查询时间复杂度:O(logn)。

二叉搜索树 二叉搜索树2

4. 平衡二叉树搜索树

平衡二叉树:每个节点的左右子树高度差不能超过 1。

C++ 中的 map, set, multimap,multiset 底层实现都是平衡二叉搜索树(元素有序)。

插入和查询的时间复杂度都是 O(logn)。

平衡二叉搜索树

二、存储方式

1. 链式存储

链式存储

2. 线性存储

完全二叉树存储。

假定一个元素索引为 i:

  • 左孩子节点:2 * i + 1
  • 右孩子节点:2 * i + 2
线性存储

三、遍历方式

1. 深度优先搜索 (DFS)

一般通过 递归 实现,也可以使用迭代法遍历。

前中后序遍历都是通过深度优先搜索来实现。

一个方向一直搜索到终点,然后再回退换另一个方向继续搜索到终点。

  • 前序遍历:中左右
  • 中序遍历:左中右
  • 后序遍历:左右中

2. 广度优先搜索 (BFS)

一层一层的遍历,层序遍历 就是广度优先搜索的一种。

层序遍历 使用队列来实现对二叉树一层一层的搜索。

四、二叉树定义

// Kotlin
data class TreeNode<T> (
	var value: T,
  var left: TreeNode<T>,
  var right: TreeNode<T>
)
// Swift
class TreeNode<T> {
  var val: T
  var left: TreeNode<T>
  var right: TreeNode<T>
    
    init(val: T, left: TreeNode<T>, right: TreeNode<T>) {
        self.val = val
        self.left = left
        self.right = right
    }
}
目录
一、种类
1. 满二叉树
2. 完全二叉树
3. 二叉搜索树
4. 平衡二叉树搜索树
二、存储方式
1. 链式存储
2. 线性存储
三、遍历方式
1. 深度优先搜索 (DFS)
2. 广度优先搜索 (BFS)
四、二叉树定义
暂无评论

在线人数:0 人

文章总浏览量:17134

Powered byNola