概述
树是经常用到的一种数据结构,他是一种非线性的数据结构,以分层的方式存储数据。树经常被用来存储有层级关系的数据,有时候还被用来存储有序列表。每棵树都是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

树具有以下的特点:
① 每个节点有零个或多个子节点;
② 没有父节点的节点称为根节点;
③ 每一个非根节点有且只有一个父节点;
④ 除了根节点外,每个子节点可以分为多个不相交的子树;
除此之外,我们还要了解几个基本概念:
节点的度:一个节点含有的子树的个数为该节点的度;
树的度:一棵树中,最大的节点的度称为树的度;
叶子节点:度为0的结点称为叶节点;
子节点:一个节点含有的子树的根节点称为该结点的子节点;
父节点:若一个节点含有子节点,则这个节点成为其子节点的父节点;
根节点:没有父节点的节点;
节点的层次:从根节点开始定义,根为第一层,根的子节点为第2层,以此类推;
深度 / 高度:树中节点的最大层次;
二叉树
二叉树是数据结构中一种重要的数据结构,也是树家族最为基础的结构。

二叉树基本特点:
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点);
二叉树的子树有左右之分,次序不能颠倒;
二叉树的第i层至多有2^i-1个结点;深度为k的二叉树至多有2^k-1个结点;
对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1
特别的二叉树:
满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。所有叶子结点必须在同一层上。

完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。

注:完全二叉树是效率很高的数据结构,堆是一种完全二叉树或者近似完全二叉树,所以效率极高,像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能优化,二叉排序树的效率也要借助平衡性来提高,而平衡性基于完全二叉树。
接下来我们来简单说说二叉树的代码实现:
class TreeNode {
constructor(data, left, right){
this.data = data
this.left = left // 左边的子节点
this.right = right // 右边的子节点
}
show(){
console.log(this.data)
}
}
二叉树的遍历方式
先序遍历:先根节点->遍历左子树->遍历右子树
中序遍历:遍历左子树->根节点->遍历右子树
后序遍历:遍历左子树->遍历右子树->根节点
