寒假集训营第二课:二叉树

一.树的特点

每个节点有零个或多个子节点

没有父节点的节点称之为根节点

每个非根节点只有一个父节点

除了根节点之外,每个子节点可以分为多个不相干的子树。

二.二叉树

1.定义

二叉树是每个结点最多有两个子树的树结构。也就是说二叉树不允许存在度大于2的树。它有五种最基本的形态:二叉树可以是空集。根可以有空的左子树或者右子树;或者左右子树都是空。其中只有左子树或者右子树的叫做斜树。

 2.二叉树的性质

3.二叉树的种类

①满二叉树:满二叉树要求所有的分支结点都存在左右子树,并且所有的叶结点都在同一层上,若满二叉树的层数为n,则结点数量为2n-1个结点,子叶只能出现在最后一层,内部结点的度都为2,如下图所示

 ②完全二叉树:从定义上来说,完全二叉树是满足若对一棵具有n个结点的二叉树按层序编号,如果编号为i的结点(1≤i≤n)于同样深度的满二叉树中编号为i的结点在二叉树的位置相同的二叉树。这样讲有些繁琐,可以理解为完全二叉树生成结点的顺序必须严格按照从上到下,从左往右的顺序来生成结点,如下图所示

 因此我们就不难观察出完全二叉树的特点,完全二叉树的叶结点只能存在于最下两层,其中最下层的叶结点只集中在树结构的左侧,而倒数第二层的叶结点集中于树结构的右侧。当结点的度为1时,该结点只能拥有左子树。

4.二叉树的存储结构

①顺序存储

 ②链式存储

 

// 孩子表示法
class Node {
 int val; // 数据域
 Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
 Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
}
// 孩子双亲表示法
class Node {
 int val; // 数据域
 Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
 Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
 Node parent; // 当前节点的根节点
}

5.二叉树的遍历

有递归遍历、前序遍历、中序遍历、后序遍历、层序遍历法。

前序遍历:根结点 -->左子树-->右子树;
中序遍历:左子树 -->根结点-->右子树;
后续遍历:左子树 -->右子树-->根结点;
层次遍历:仅仅需按成次遍历即可。

6.时空复杂度分析

二叉排序树的插入和查找、删除操作的最坏时间复杂度为O(h),其中h是二叉排序树的高度。最极端的情况下,我们可能必须从根结点访问到最深的叶子结点,斜树的高度可能变成n,插入和删除操作的时间复杂度将可能变为O(n)。下图就是两颗斜树(就相当于单链表)。这也是二叉排序树在进行多次插入操作后可能发生的不平衡问题,也是二叉排序树的缺陷所在,但这依旧不妨碍其作为一个伟大的数据结构。

7.总结

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分[1]。
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值