种类
满二叉树
-
一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上
-
深度为k,有2^k-1个节点的二叉树
完全二叉树
-
除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置
-
最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点
二叉搜索树
-
二叉搜索树是一个有序(有数值)树
-
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值
-
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
-
它的左、右子树也分别为二叉排序树
平衡二叉搜索树
-
AVL(Adelson-Velsky and Landis)
-
它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树
-
最后一棵不是平衡二叉树,因为它的左右两个子树的高度差的绝对值超过了1
-
C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树
-
map、set的增删操作时间时间复杂度是logn
-
unordered_map、unordered_set底层实现是哈希表
-
二叉树的存储方式
-
链式存储:指针
- 通过指针把分布在各个地址的节点串联一起
-
顺序存储:数组
-
在内存是连续分布的
-
如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2
-
二叉树的遍历方式
-
深度优先遍历(先往深走,遇到叶子节点再往回走)
-
前序遍历(递归法,迭代法)
- 中左右
-
中序遍历(递归法,迭代法)
- 左中右
-
后序遍历(递归法,迭代法)
- 左右中
-
前中后,指的是中间节点的遍历顺序
-
栈其实就是递归的一种实现结构
-
-
广度优先遍历(一层一层的去遍历)
-
层次遍历(迭代法)
-
用队列来实现
-
二叉树的定义
function TreeNode(val, left, right) {
this.val = (val===undefined ? 0 : val)
this.left = (left===undefined ? null : left)
this.right = (right===undefined ? null : right)
}
class TreeNode {
public val: number;
public left: TreeNode | null;
public right: TreeNode | null;
constructor(val?: number, left?: TreeNode, right?: TreeNode) {
this.val = val === undefined ? 0 : val;
this.left = left === undefined ? null : left;
this.right = right === undefined ? null : right;
}
}