说到二叉树,大家对于二叉树其实都很熟悉了,在这里我对二叉树的理解进行分享。
二叉树的分类
二叉树有主要的两种形式:完全二叉树和满二叉树
满二叉树
满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。
这棵树为满二叉树,也可以说深度为k,有2^k-1个节点
完全二叉树
在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。
二叉搜索树
前面两种树,都没有具体数值的,而二叉搜索树是有数值的了,二叉搜索树是一个有序树。 它具有以下特点
- 若左子树不为空,则左子树上的节点均小于它的根节点
- 若右子树不为空,则右子树上的节点钧大于他的根节点
- 左右子树也可为二叉排序树
平衡二叉搜索树
它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。如下图所示
最后一棵 不是平衡二叉树,因为它的左右两个子树的高度差的绝对值超过了1。
二叉树的存储方式
二叉树可以链式存储,也可以顺序存储。
那么链式存储方式就用指针, 顺序存储的方式就是用数组。
顾名思义就是顺序存储的元素在内存是连续分布的,而链式存储则是通过指针把分布在各个地址的节点串联一起。
链式存储:
顺序存储:
如果父节点数组下标是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…