- 数据结构与算法
- DSA - 首页
- DSA - 概述
- DSA - 环境搭建
- DSA - 算法基础
- DSA - 渐进分析
- 数据结构
- DSA - 数据结构基础
- DSA - 数据结构和类型
- DSA - 数组数据结构
- 链表
- DSA - 链表数据结构
- DSA - 双向链表数据结构
- DSA - 循环链表数据结构
- 栈与队列
- DSA - 栈数据结构
- DSA - 表达式解析
- DSA - 队列数据结构
- 搜索算法
- DSA - 搜索算法
- DSA - 线性搜索算法
- DSA - 二分搜索算法
- DSA - 插值搜索
- DSA - 跳跃搜索算法
- DSA - 指数搜索
- DSA - 斐波那契搜索
- DSA - 子列表搜索
- DSA - 哈希表
- 排序算法
- DSA - 排序算法
- DSA - 冒泡排序算法
- DSA - 插入排序算法
- DSA - 选择排序算法
- DSA - 归并排序算法
- DSA - 希尔排序算法
- DSA - 堆排序
- DSA - 桶排序算法
- DSA - 计数排序算法
- DSA - 基数排序算法
- DSA - 快速排序算法
- 图数据结构
- DSA - 图数据结构
- DSA - 深度优先遍历
- DSA - 广度优先遍历
- DSA - 生成树
- 树形数据结构
- DSA - 树形数据结构
- DSA - 树的遍历
- DSA - 二叉搜索树
- DSA - AVL树
- DSA - 红黑树
- DSA - B树
- DSA - B+树
- DSA - 伸展树
- DSA - 字典树
- DSA - 堆数据结构
- 递归
- DSA - 递归算法
- DSA - 使用递归实现汉诺塔
- DSA - 使用递归实现斐波那契数列
- 分治法
- DSA - 分治法
- DSA - 最大最小问题
- DSA - Strassen矩阵乘法
- DSA - Karatsuba算法
- 贪心算法
- DSA - 贪心算法
- DSA - 旅行商问题(贪心算法)
- DSA - Prim最小生成树
- DSA - Kruskal最小生成树
- DSA - Dijkstra最短路径算法
- DSA - 地图着色算法
- DSA - 分数背包问题
- DSA - 带截止期限的作业排序
- DSA - 最优合并模式算法
- 动态规划
- DSA - 动态规划
- DSA - 矩阵链乘法
- DSA - Floyd-Warshall算法
- DSA - 0-1背包问题
- DSA - 最长公共子序列算法
- DSA - 旅行商问题(动态规划)
- 近似算法
- DSA - 近似算法
- DSA - 顶点覆盖算法
- DSA - 集合覆盖问题
- DSA - 旅行商问题(近似算法)
- 随机化算法
- DSA - 随机化算法
- DSA - 随机化快速排序算法
- DSA - Karger最小割算法
- DSA - Fisher-Yates洗牌算法
- DSA 有用资源
- DSA - 问答
- DSA - 快速指南
- DSA - 有用资源
- DSA - 讨论
树形数据结构
树形数据结构
树是一种非线性的抽象数据类型,具有层次结构。它由节点(存储数据的地方)通过链接连接而成。树形数据结构源于单个称为根节点的节点,并具有连接到根的子树。
重要术语
以下是关于树的重要术语。
路径 − 路径指的是沿着树的边的节点序列。
根 − 树顶部的节点称为根。每棵树只有一个根,并且从根节点到任何节点只有一条路径。
父节点 − 除根节点外的任何节点都有一条向上连接到称为父节点的节点的边。
子节点 − 下方由其向下边连接的给定节点称为其子节点。
叶子节点 − 没有子节点的节点称为叶子节点。
子树 − 子树表示节点的后代。
访问 − 访问是指当控制处于节点上时检查节点的值。
遍历 − 遍历意味着以特定顺序通过节点。
层级 − 节点的层级表示节点的代数。如果根节点在第0层,则其下一个子节点在第1层,其孙子节点在第2层,依此类推。
键 − 键表示节点的值,根据该值将对节点进行搜索操作。
树的类型
树有三种类型:
一般树
二叉树
二叉搜索树
一般树
一般树是非有序的树形数据结构,其中根节点最多有0个或n个子树。
一般树对它们的层次结构没有约束。因此,根节点充当所有其他子树的超集。
二叉树
二叉树是一般树,其中根节点最多只能包含2个子树:左子树和右子树。根据子节点的数量,二叉树分为三种类型。
满二叉树
满二叉树是一种二叉树类型,其中每个节点都具有0个或2个子节点。
完全二叉树
完全二叉树是一种二叉树类型,其中所有叶子节点都必须位于同一层。但是,完全二叉树中的根节点和内部节点可以具有0、1或2个子节点。
完美二叉树
完美二叉树是一种二叉树类型,其中所有叶子节点都位于同一层,并且除叶子节点外的每个节点都有2个子节点。
二叉搜索树
二叉搜索树具有二叉树的所有属性,包括一些基于某些约束的额外属性,使其比二叉树更有效。
二叉搜索树 (BST) 中的数据总是以这样的方式存储:左子树中的值总是小于根节点中的值,而右子树中的值总是大于根节点中的值,即左子树 < 根节点 ≤ 右子树。
BST 的优点
二叉搜索树比二叉树更有效,因为执行各种操作的时间复杂度降低了。
由于键的顺序仅基于父节点,因此搜索操作变得更简单。
BST 的排列也有利于范围查询,范围查询用于查找两个键之间存在的值。这有助于数据库管理系统。
BST 的缺点
二叉搜索树的主要缺点是,如果节点中的所有元素都大于或小于根节点,树将变得倾斜。简单地说,树完全倾斜到一边。
这种倾斜将使树成为链表而不是 BST,因为搜索操作的最坏情况时间复杂度变为 O(n)。
为了克服二叉搜索树的倾斜问题,引入了平衡二叉搜索树的概念。
平衡二叉搜索树
考虑一个二叉搜索树,其中左子树的高度为“m”,右子树的高度为“n”。如果 (m-n) 的值为 0、1 或 -1,则该树被称为平衡二叉搜索树。
树的设计方式是在高度差超过 1 时自动平衡。二叉搜索树使用旋转作为自平衡算法。有四种不同的旋转类型:左左、右右、左右、右左。
有各种类型的自平衡二叉搜索树: