数据结构 | 树-01

223 阅读2分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

树,是我们很常见的一种数据结构,比如MySQL会使用的B+树,MongoDB会使用B-树。二叉树的算法题,也是在很多大公司的考察范围内,考察面试者对数据结构的理解。

概念定义

结点和边组成,不存在环的一种数据结构。如图

  • 根结点:一个结点没有父结点,则为根结点
  • 子节点: 一个节点含有的子树的根节点称为该节点的子节点
  • 叶子结点:一个结点都没有子结点则为叶子结点
  • 深度:结点的层次,从根结点开始计算。树中结点的最大层次树,就是树的深度(高度)

类型

  • 二叉树:每个结点最多有2个结点 (如:哈夫曼树、霍夫曼树、最优二叉树)
  • 完全二叉树:除了最后一层以外,其他层的结点个数都达到最大,并且最后一层的叶子结点都靠左(因和存储有关系)
  • 满二叉树:只有最后一层没有子结点,其他所有层上的所有结点都有2个子结点的二叉树
  • 二叉查找树:(如:红黑树、伸展树)

    • 任意一个结点,其左子结点都小于此结点
    • 任意一个结点,其右子结点都大于此结点
    • 尽可能不出现2个结点的值相等情况
    • 二叉查找树的中序遍历就可以输出一个从小到大的数据队列

数据结构

  • 顺序存储法
  • 链式存储法

二叉树的结点定义

//JavaScrip实现 
function treeNode(val) {
     this.val = val; // 当前结点的值
     this.left = null; //指向左子节点
     this.right = null; //指向右子节点
}
// Golang实现
type TreeNode struct {
    val int
    left *TreeNode
    right *TreeNode
}

二叉树遍历

  • 先序遍历:先根节点->遍历左子树->遍历右子树
  • 中序遍历:遍历左子树->根节点->遍历右子树
  • 后序遍历:遍历左子树->遍历右子树->根节点
  • 层次遍历:按照树中的层次从左到右依次遍历每层中的结点