[LeetCode训练营]树

树的定义

树和单链表的区别:

  • 单链表:一个数据域+一个指针域
  • 树:一个数据域+多个指针域

树的定义

树是N(N>=0)个节点的有限集合。N=0时为空树,N>0时应满足:

  • 有且仅有一个特定的称为根的节点
  • N>1时,其余节点可分为m(m>0)个互不相交的有限集合。其中,每一个有限集合自身又是一棵树。
    在这里插入图片描述
  1. 根节点:非空树处于最上层的唯一节点,其余节点都是它的子孙后代
  2. 节点的度:节点具有的孩子节点个数
  3. 叶子节点:度为0的节点
  4. 父子节点:直接相连的一对节点,处于上层的是父节点,处于下层的是子节点
  5. 兄弟节点:由同一个父节点生出的不同节点互称兄弟节点
  6. 节点层次:由根开始记为1层,其子节点为2层,孙子节点为3层……
  7. 节点深度:节点所在的层次数
  8. 树的深度/高度:树的最大层次数
  9. 节点高度:以节点为根的子树的深度/高度
  10. 有序树:以兄弟节点为根的子树交换位置得到的新树视作与原来的树不同的树
  11. 无序树:以兄弟节点为根的子树交换位置得到的新树视作与原来的树相同的树

树的

二叉树

二叉树是一种每个节点度都不大于二的树。其中,每个节点的子节点有左右之分左右子节点所在的子树不可以交换位置,即二叉树是一棵有序树。

满二叉树

所有叶子节点全部在最底层,且所有非叶子节点度都是二的树。

可见蓝色是满二叉树
满二叉树
记满二叉树T高度为h,节点总数为n,则n =2h -1,第k层节点总数为2k-1
从1开始,对T从上到下,从左到右进行编号。如果编号 i 的节点有父节点,则其父节点编号为[i/2],如果有左子节点,则其左子节点编号为 2i ,如果有右子节点,则其右子节点编号为 2i+1。

完全二叉树

记二叉树高度为h。从1开始,对二叉树从上到下,从左到右进行编号。
对高度同为h的满二叉树做同样的编号处理。如果二叉树中所有节点的编号都能与满二叉树中同样位置的节点编号一致,则该二叉树是一棵完全二叉树。

橙色是一个编好号的满二叉树,可见蓝色是完全二叉树。
完全二叉树
特点:

  • 完全二叉树的叶子节点只可能存在于最下面的两层中,且最下层的叶子节点全部是靠左紧密排列的
  • 完全二叉树中父子节点之间的编号规律与满二叉树的规律完全相同,且编号大于[n/2]的节点必是叶子节点
  • 如果n为奇数,则每个非叶子节点都有两个子节点
  • 如果n为偶数,则第n/2个节点必为非叶子节点,且它只有左子结点而无右子节点,其余非叶子节点都有两个子节点

二叉搜索树(BST)

二叉搜索树要么是空树,要么同时满足以下条件:

  • 左子树所有节点的关键字均小于根节点的关键字
  • 右子树所有节点的关键字均大于根节点的关键字
  • 左右子树也均为二叉搜索树
    二叉搜索树

二叉搜索树经典的应用场景就是存放有序数据,提升查找效率
用同一个有序序列,可以构造出多个不同的二叉搜索树

平衡二叉树(AVL)

如果二叉树中每个节点的左右子树高度差都不大于1,则这棵二叉树就是平衡二叉树。
平衡二叉树经典的应用场景就是与二叉搜索树结合,形成平衡二叉搜索树。
平衡二叉树

树的查找操作

查找/搜索/遍历是树的核心操作

二叉树的深度优先搜索(DFS)

  • 必须以根节点为搜索起始节点并“进入”
  • 优先“进入”当前节点的左子节点,其次“进入”当前节点的右子节点
  • 如果当前节点为空节点或者左右子节点都被“进入”过,则再次“进入”父节点
    在这里插入图片描述
    1,2,4,null,4,null,4,2,5,null,5,null,5,2,1,3,null,3,6,null,6,null,6,3,1

二叉树的广度优先搜索(BFS)

从根节点开始,按层次从上到下,同层次内从左到右“访问”每一个节点也叫做层次遍历每个节点只会“进入”一次。
在这里插入图片描述
层次遍历序列:1,2,3,4,5,6

本文章主要内容摘自阿里云天池leetcode训练营,主要当作笔记记录,如有错误的地方或者有没写完的地方,请见谅。

猜你喜欢

转载自blog.csdn.net/qq_45415920/article/details/123099618