前言:很多高级的数据结构通常都是对常用数据结构增加限制而来。
树作为重要的数据结构之一,经常出现在很多算法题的应用中。本文将介绍基础的树理论及其延伸出的数据结构。话不多说,直接上图。
我们顺着图1的箭头,从上至下,从左到右依次看。
单链表
链表由多个节点组成,在经典的单链表结构中,每个节点都有其相应的前驱节点和后继节点(例外:头节点只有后继节点;尾结点只有前驱节点)单链表的结构如图2所示。
如图2所示,单链表中的每个节点存储有节点值和指向后继节点的Next指针(因为尾结点没有后继节点,所以Next指针指向None)
class Node:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
树
当单链表中每个节点最多只有一个前驱节点和可以有多个后继节点时,就变成了树(树根没有前驱节点,叶子节点没有后继节点)。树的结构如图3所示。
如图3所示,根节点1有三个后继节点(称为孩子节点),叶子节点5和6没有孩子节点。
class Node:
def __init__(self, val=0, next=[]):
self.val = val
self.children = next
二叉树
在树中,一个节点可能会有多个孩子。那么如果限定孩子的数量不超过2个,所得到的树就是二叉树。在众多树的类型中,二叉树由于其自身的一些好的性质,被研究的最广泛。在二叉树中,孩子的数量被限定不超过2个,所以可以简单地把孩子分成左孩子和右孩子。顾名思义,在父节点左边的就是左孩子,在父节点右边的就是有孩子。
class Node:
def __init__(self, val=0, left_child=None, right_child=None):
self.val = val
self.left_child = left_child
self.right_child = right_child
完全二叉树
有一种特殊的二叉树叫做完全二叉树。完全二叉树中节点的排列是有限制的,必须从上到下(根节点到叶子节点),从左到右(左孩子到右孩子)依次填满。举个例子:如图5所示的二叉树就是一棵完全二叉树,而图6所示的二叉树就不是一棵完全二叉树。
满二叉树
由于二叉树每个节点最多只有两个孩子,那么对于一个高度为的二叉树来说,最多可能有个,其中叶子节点数量正好是个,如果所有的节点全部存在,那么这棵树就是一个满二叉树。满二叉树如图7所示。
二叉查找树
二叉查找树也叫二叉搜索树。对于一棵二叉树,如果满足:1、父节点的值大于左子树上所有节点的值;2、父节点的值小于右子树上所有节点的值。(注意条件1和条件2中没有等于)那么这棵二叉树就是一棵二叉查找树。二叉查找树如图8所示。
如图8所示,以节点8为例,其左子树上有1,3,5,右子树上有9,显然8比左子树上所有数大,且比右子树上所有数小,所有该树是一棵二叉查找树。
平衡二叉树
平衡二叉树,又被称为AVL树,具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且两个子树都是一棵平衡二叉树。平衡二叉树是一棵高度平衡的二叉查找树。如图9所示是一棵平衡二叉树,图9所示不是一棵平衡二叉树。
如图10所示,节点9的没有左子树,所以左子树的高度为0,右子树的高度为2,左子树和右子树的高度差为2,大于1。所以不符合平衡二叉树的定义。
写在最后:学习到的知识点最好能够,由点及线,由线及面地串联起来,希望本文能够帮助到你。