1. 树
1.1基本概念
每个节点只有一个前驱节点(父节点),有0~n个后继节点(子节点),叶子节点没有子节点,唯一 没有前驱节点的是根节点。
n 个节点的边为n-1
实现方式:递归,根->字树
根节点:深度唯一,树中唯一没有父节点的节点
子节点:一个节点的后继节点为字节点
叶子结点:没有子节点的节点
深度:根节点到节点中边的数量,树的深度就是所有叶子结点的最大值
高度:节点到叶子节点的边的数量
兄弟节点:拥有共同父亲节点的子节点
路径:一个节点到另一个节点的边构成的有序的集合,任意两个路径唯一
基本结构
struct node
{
int data; //数据域
struct node *first_child; //第一个子节点
struct bode *next_sibing; //第一个兄弟节点
}
2. 二叉树
每个节点最多只有两个子树的树,称为二叉树
左孩子,左子树 ; 右孩子,右子树
满二叉树:存储结构 完全二叉树:存储结构
1. 顺序存储,基于数组实现(数组的下标随机访问的时间复杂度O(1))
- 满二叉树
- 完全二叉树
- 堆
- 优先级队列
链式存储结构定义
struct TreeNode { | |
int data; // 数据域 | |
struct TreeNode *left; // 左子树指针 | |
struct TreeNode *right; // 右子树指针 | |
}; |
堆
堆是一种特殊的完全二叉树,其中每个节点的值都大于或等于(最大堆)或小于或等于(最小堆)其子节点的值。你给出的数组 [12, 9, 23, 5, 17, 42, 56, 11, 20, 3]
可以被看作是一个堆(但不一定是最大堆或最小堆,这取决于具体的堆属性)。堆的常用操作包括插入(堆化上调)、删除(堆化下调)、以及基于堆的排序算法(如堆排序)。
二叉搜索树 (BST)
二叉搜索树是一种特殊的二叉树,其中对于树中的每个节点X,其左子树中的所有项的值都小于X中的项,而其右子树中的所有项的值都大于X中的项。。
二叉树遍历
你已经列出了四种基本的二叉树遍历方法:
- 先序遍历:根 -> 左 -> 右
- 中序遍历:左 -> 根 -> 右
- 后序遍历:左 -> 右 -> 根
- 层序遍历:从上到下,从左到右遍历每个节点
对于你给出的完全二叉树 [A, B, C, D, E, F, G, H, I, J, K]
,你已经正确地写出了各种遍历的结果。
示例代码(遍历)
由于这里无法直接展示完整的遍历代码,我将给出一个简单的中序遍历的伪代码框架,以帮助你理解如何编写遍历函数。
void inorderTraversal(TreeNode* root) { | |
if (root != NULL) { | |
inorderTraversal(root->left); // 遍历左子树 | |
printf("%d ", root->data); // 访问根节点 | |
inorderTraversal(root->right); // 遍历右子树 | |
} | |
} |
对于其他遍历方式,你可以通过调整访问根节点的位置(在遍历左子树之前、之后或与之并列)来实现。层序遍历则通常使用队列来实现。
例子
12,9, 23, 5, 17, 42 ,56 , 11, 20,3
12
9 23
5 11 17 42
3 _ _ 20 _ 56
二叉树遍历
- 先序遍历: 根->左->右 12,9,5,3,11,23,17,20,42,56
- 中序遍历: 左->根->右 3,5,9,11,12,17,20,23,42,56 排序 最左边为最小值,最右边为最大值
- 后序遍历: 左->右->根 3,5,11,9,20,17,56,42,23,12
- 层序遍历 12,9,23,5,11,17,42,3,20,56