算法

二叉树


二叉树结点的定义


struct TreeNode {
	int val;
	TreeNode* left;
	TreeNode* right;
	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};  //分号记得

有关二叉树的一些概念


  1. 根节点:位于二叉树顶层的节点,没有父节点。
  2. 叶节点:没有子节点,两个左右子节点的指针为空。
  3. 节点的层:从顶到底递增,根节点所在层为1;
  4. 节点的度:节点的子节点的数量。二叉树中,度的范围是0,1,2。
  5. 边:连接两个节点的线段。即节点指针。
  6. 二叉树的高度:从根节点到最远叶节点所经过的边的数量。
  7. 节点的深度:从根节点到该节点所经过的边的数量。
  8. 节点的高度:从最远叶节点到该节点所经过的边的数量。

二叉树的类型


  1. 完美二叉树(满二叉树):每一层都填满了节点,并且最底层节点的度为0,其余所有层的度为2,这个填满指的是节点都有左右子节点。如果树的高度为h(节点计数),则节点总数为2^(h)-1。典型的细胞分裂现象。
  2. 完全二叉树:除了最底层节点没有被填满外,其他所有层节点被填满。且最底层节点靠左填充。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。
  3. 完满二叉树:除了叶子结点外,其余所有节点都有两个子节点。
  4. 平衡二叉树:任意节点的左子树和右子树的高度差的绝对值不超过1。
  5. 二叉搜索树:它是一个有序树,若左子树不为空,则左子树上所有节点的值小于根节点的值。若右子树不为空,则右子树上所有节点的值大于根节点的值。并且它的左右子树也分别为二叉搜索树。
  6. 平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,平衡二叉树和二叉搜索树的结合体。
  7. 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。

二叉树的存储方式


二叉树有链式存储和顺序存储两种方式。

链式存储的方式是用指针,而顺序存储的方式使用数组。顺序存储的元素在内存是连续分布的。而链式存储的元素是通过指针把存放在各个地址的节点串联起来。

链式存储是比较熟悉也是比较常用的方式。对于数组存储,是对二叉树进行从上到下从左到右从0开始编号,也就是进行层序遍历。那么第0个节点就存放在数组中下表为0的位置,这样以此类推。

顺序存储时(数组存储),遍历二叉树的方式是父节点的数组下标是i,左孩子就是2i+1,右孩子是2i+2。

二叉树的遍历方式


  1. 深度优先遍历:前序遍历、中序遍历、后序遍历。
  2. 广度优先遍历:层次遍历。

在需要比较大小,求最小值时,定义一个最大值(INT_MAX or LONG_MAX)。求最大值时,定一个最小值(INT_MIN or LONG_MIN)。

十大排序


十大排序

链表


双向链表

双向链表是链表的一种,它的每个节点中有两个指针,一个前指针,指向它的前驱节点,一个后指针,指向它的后继节点。

循环双向链表(双向循环链表)

循环双向链表是在双向链表的基础上,使得首节点的前指针指向尾节点,尾结点的后指针指向首节点。也就是通过每个节点的前指针或者后指针都能够循环访问整个链表。

单向链表

每个节点只有一个指针指向它的下一个节点。

循环单向链表(单向循环链表)

在单链表的基础上,让尾结点的指针指向首节点。单链表任意一个节点的访问都必须从首节点开始才能访问到。但循环单向链表就不要这样了,可以从任意节点出发,都能访问到任意节点。

posted @ 2023-11-09 22:37  Jasonat0  阅读(50)  评论(0)    收藏  举报