目录
二叉树的定义
二叉树是n(n>=0)个结点的集合该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。
二叉树的特点
- 每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。
- 左子树和右子树是有顺序的。
- 即使树中某结点只有一颗子树,也要区分是左子树还是右子树。
如图,树1与树2是同一棵树,但却不是不同的二叉树
二叉树的基本形态
- 空二叉树
- 只有一个根结点(n=1)
- 根结点只有左子树
- 根结点只有右子树
- 根结点既有左子树也有右子树
如图:三结点的二叉树的不同形态
以上是五个不同的二叉树
特殊二叉树
斜树:
所有的结都只有左子树的二叉树叫左斜树,所有的结都只有右子树的二叉树叫右斜树。(和线性表的结构一样,可以把线性表结构理解为树的一种特殊表现形式)
满二叉树:
所有分支结点都存在左子树和右子树,并且所有叶子都在同一层的二叉树。
满二叉树的特点
-
叶子只能出现在最下一层
-
非叶子节点的度一定是2
-
在同样深度的二叉树中,满二叉树的节点个数最多,叶子树最多。
完全二叉树
对一颗具有n个节点的二叉树按层序编号,如果编号为i(1<= i <=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,这样的二叉树称为完全二叉树。
满二叉树一定是完全二叉树
编号必须是连续的
完全二叉树的特点
- 叶子节点只能出现在最下两层
- 最下层的叶子一定集中在左部连续位置
- 若节点的度为1,则改节点只有左孩子
- 同样节点的二叉树,完全二叉树的深度最小
二叉树的性质
- 在二叉树的第 i 层上最多有2(i-1)次方个结点
- 深度为 k 的二叉树最多有2(k)次方 -1 个结点(总节点数量)
- 对任何一棵树,如果其叶子数为n0,度为2的结点数为n2,则n0=n2+1。(其实就是2(i-1)次方=2(i-1)次方 -1 +1)(叶子树=性质2 - 性质1
- 具有n个结点的完全二叉树的深度为[log2的n]+1,[ ]为取整符号。
- 如果对一棵有n个结点的完全二叉树的结点按层序编号,对任一结点 i (1<= i <=n)有
如果 i =1,则结点 i 是二叉树的根,无双亲,如果 i>1,则其双亲是结点[i/2]。
如果2i>n,则结点 i 无左孩子,否则其左孩子的结点为 2i。
如果2i+1>n,则结点 i 无右孩子,否则其右孩子的结点为 2i+1。
二叉树的存储结构
1.二叉树的存储结构
因为二叉树可以按照满二叉树按层序编号后可以与数组的下标一一对应,所以可以用数组来存储二叉树。
但如果存储一些斜树等,容易浪费空间,所以顺序存储一般用于存储完全二叉树。
2.二叉链表
因为二叉树的每个结点最多有两个孩子,所以可以设计其结点为一个数据域data,两个指针域lchild和rchild
用链式表示的二叉树,更有利于我们理解,所以一般我们都是用链式存储二叉树。
二叉树的遍历方式
二叉树主要有两种遍历方式
1.深度优先遍历:先往深走,遇到叶子节点在往回走
2.广度优先遍历:一层一层的去遍历。
深度优先遍历
- 前序遍历(递归法,迭代法)
- 中序遍历(递归法,迭代法)
- 后序遍历(递归法,迭代法)
二叉树的定义
刚刚我们说过了二叉树有两种存储方式顺序存储,和链式存储,顺序存储就是用数组来存,这个定义没啥可说的,我们来看看链式存储的二叉树节点的定义方式。
//其他ts文件引入此模块时 需export
class TreeNode {
val: number;
left: TreeNode | null;
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;
}
}
二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。
总结
二叉树是一种基本数据结构,在算法面试中都是常客,也是众多数据结构的基石
二叉树与递归紧密相连