二叉树

103 阅读3分钟

说到二叉树,大家对于二叉树其实都很熟悉了,在这里我对二叉树的理解进行分享。

二叉树的分类

二叉树有主要的两种形式:完全二叉树满二叉树

满二叉树

满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。

image.png

这棵树为满二叉树,也可以说深度为k,有2^k-1个节点

完全二叉树

在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。

image.png

二叉搜索树

前面两种树,都没有具体数值的,而二叉搜索树是有数值的了,二叉搜索树是一个有序树。 它具有以下特点

  • 若左子树不为空,则左子树上的节点均小于它的根节点
  • 若右子树不为空,则右子树上的节点钧大于他的根节点
  • 左右子树也可为二叉排序树

image.png

平衡二叉搜索树

它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。如下图所示

image.png 最后一棵 不是平衡二叉树,因为它的左右两个子树的高度差的绝对值超过了1。

二叉树的存储方式

二叉树可以链式存储,也可以顺序存储。

那么链式存储方式就用指针, 顺序存储的方式就是用数组

顾名思义就是顺序存储的元素在内存是连续分布的,而链式存储则是通过指针把分布在各个地址的节点串联一起。

链式存储:

image.png

顺序存储:

image.png

如果父节点数组下标是i,那么它的左孩子就是 2i +1,右孩子就是2i +2

二叉树的遍历

我们要对二叉树进行遍历,首先要知道二叉树遍历的基本方式有哪些

首先是我们熟知的前中后序遍历(深度遍历),还有就是层次遍历(广度遍历)

二叉树的遍历主要分为两种:

深度优先遍历

  • 前序遍历(递归,迭代)
  • 中序遍历(递归,迭代)
  • 后序遍历(递归,迭代)

广度优先遍历

层次遍历(迭代)

二叉树的定义

前面有说到二叉树有两种存储方式,顺序存储和链式存储,对于顺序存储来说我们可以用数组实现,对于链式存储来说我们这了就可以用链表来进行实现了。

function TreeNode(val,left,right) {
    this.val = (val === undefined ? 0 : val)
    this.left = (left === undefined ? null : val)
    this.right = (right === undefined ? null : val)
}

总结

二叉树是一种基础的数据结构,在实际应用中也是非常广泛的。在本文中我介绍二叉树的分类、存储方式、遍历方式以及在js中的定义。

说明:本篇文章借鉴于www.programmercarl.com/%E4%BA%8C%E…