1. 二叉树
二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点 -- 引自百度百科
1.1 我理解的二叉树
我觉得二叉树就像一个树杈,类似下面的东西👇。不过树杈可能有多个,二叉树只有两个。
将上面的树变成二叉树则类似以下的结构。
既然是树,那么就有根。二叉树的根叫根节点,其余的称之为叶节点。叶节点也有父节点和子节点。树有高度,二叉树也有高度,从根节点到走到最低的节点的次数就是高。
二叉树除了高还有层,根节点为第一层。二叉树每一层最大节点树等于(层数n)。一个高度为m的二叉树最多节点等于。任意的二叉树中,叶子节点为n0,度为2的节点树n2,则必有。
上面的二叉树高度为三、层数也是3.
1.2 完全二叉树
深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应时,称为完全二叉树
特点
-
叶子结点只能出现在最下层和次下层。
-
最下层的叶子结点主要在树的左侧。
-
倒数第二层若存在叶子结点,一定在右部连续位置。
-
如果结点度为1,则该结点只有左孩子,即没有右子树。
-
同样结点数目的二叉树,完全二叉树深度最小。
满二叉树一定是完全二叉树,但反过来不一定成立。
1.3 满二叉树
如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树
就是每个节点要么没有节点,要么就是有两个节点。类似以下的结构就是满二叉树。
特点
-
叶子只能出现在最下一层。出现在其它层就不可能达成平衡。
-
非叶子结点的度一定是2。
-
一样深度的二叉树,满二叉树的结点个数最多,叶子数最多。
1.4 实现一个数
class BitTree {
val = null;
left = null;
right = null;
constructor(val, left = null, right = null) {
this.val = val;
this.left = left;
this.right = right;
}
}
1.5 前序遍历
前序遍历:从根节点开始,到左节点,再到右节点。根节点->左节点->右节点
function preOrderTraverse(treeNode, arr) {
if (treeNode) {
arr.push(treeNode.val);
preOrderTraverse(treeNode.left, arr);
preOrderTraverse(treeNode.right, arr);
}
}
preOrderTraverse(treeNode, []);