二叉树的基本概念

一.定义

二叉树是另一种树形结构,其特点是每个结点至多只有两颗子树(即二叉树中不存在度大于2的结点),并且,二叉树有左右之分,其次序不能任意颠倒。 
与树类似,二叉树同样采用递归的形式定义。 
二叉树是n( n0 )个结点的有限集合:

  • 或者为空二叉树,即 n=0
  • 或者由一颗根几点和两个互不相交的被称为根的左子树和右子树组成,左子树和右子树又分别是一颗二叉树。

二叉树是有序树,若将其左、右子树颠倒,就成为另一颗不同的二叉树。即使树中结点只有一个子树,也要区分它是左子树还是右子树。 
但是二叉树又不同于度为2的有序树。

  • 度为2的有序树只要需要3个结点,但是二叉树却可以为空;
  • 度为2的有序树的孩子结点的左右次序是相对于另一个孩子而言的;如果某个结点只有一个孩子结点,这个孩子结点就无须区分其左右次序,而二叉树无论其结点的孩子数量是否为2,均需区分其左右次序。

二.性质

2.1普通二叉树的基本性质

  • 非空二叉树上叶子结点数等于度为2的结点数加1;
  • 非空二叉树上第i层上至多有 2i1(i1) 个结点;
  • 高度为h的二叉树至多有 2h1(h1) 个结点;
  • 具有N (N>0) 个结点的完全二叉树的高度为 log2(N+1) log2N+1 ;

2.2完全二叉树所特有的基本性质

对完全二叉树按照从上到下、从左到右的顺序依次编号 1,2,...,N ,则有一下关系:

  • i>1 时,结点i的双亲节点编号为 i2 。即 
    • 当i为偶数时,其双亲节点的编号为 i2 ,它是双亲结点的左孩子;
    • 当i为奇数时,其双亲节点的编号为 i12 ,它是双亲结点的右孩子
  • 2×iN 时,结点i的左孩子编号为 2×i ,否则无左孩子;
  • 2×i+1N 时,结点i的右孩子编号为 2×i+1 ,否则无右孩子;
  • 结点i所在层次(深度)为 log2i+1

三.存储结构

3.1 顺序存储结构

二叉树的顺序存储结构就是用一组连续的存储单元依次自上而下,自左至右按照“完全二叉树”的方式存储在某个数据下标为 i1 的分量中,然后再通过其他方法来确定逻辑上的父子和兄弟结点之间的关系。

结合二叉树的性质以及一维数组的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一的反映出结点之间的逻辑关系,这样既能最大可能的节省存储空间,又可以利用数组元素的下标值确定结点在二叉树中的位置以及结点之间的关系。 
其存储结构如图所示,其中0表示并不存在的空结点。

顺序存储结构

但对于一般的二叉树,为了让数组下标能反映二叉树中结点之间的逻辑关系,只能添加一些并不存在的空结点让其每个结点与完全二叉树的结点相对照,再存储到一维数组的相应分量中。这样以来,在最坏的情况下,一个高度为h且只有h个结点的单支树却需要占据 2h1 个存储单元。

3.2 链式存储结构

由于顺序存储对空间利用率比较低,因此一般二叉树都采用链式存储结构。链式结构是指利用一个链表来存储一个二叉树,二叉树中每一个结点用链表的一个链结点来存储。在二叉树中,结点结构通常包括若干数据域和若干指针域。二叉链表至少包括3个域:data[数据域]lchild[左指针域]rchild[右指针域]。如图所示:

链式存储结构

容易验证,在含有n个结点的二叉链表中含有 n+1 个空链域。

四.特殊的二叉树

4.1满二叉树

一颗高度为h,并且含有 2h1 个结点的二叉树称为满二叉树。即树中的每一层都含有最多的结点。满二叉树的叶子结点都集中在二叉树的最下一层,并且除叶子结点之外的每个结点度数均为2。

满二叉树

可以对满二叉树按层序编号:预定编号从根结点(根结点编号为1)起,自上而下,自左向右。这样每个结点就对应一个编号。 
对于编号为1的结点 
- 如果有双亲,其双亲为 i2
- 如果有左孩子,则左孩子为 2×i ; 
- 如果有右孩子,则右孩子为 2×i+1

4.2完全二叉树

设一个高度为h,有n个结点的二叉树,当且仅当每一个结点都与高度为h的满二叉树中编号为1~n的结点一一对应时,称为完全二叉树。

完全二叉树

  • in2 ,则结点i为分支节点,否则为叶子结点;
  • 叶子结点只有可能在层次最大的两层上出现,对于最大层次中的叶子结点,都依次排列在该层最左边的位置上;
  • 如果有度为1的结点,只可能有一个,且该结点只有左孩子而无右孩子;
  • 按层序编号后,一旦出现某结点(其编号为i)为叶子结点或只有左孩子结点,则编号大于i的结点均为叶子结点;
  • 若n为奇数,则每个分支结点都有左孩子和右孩子;若n为偶数,则编号最大的分支结点只有左孩子而没有右孩子,其余分支节点同时拥有左孩子和有孩子。

4.3二叉排序树

左子树上所有结点的关键字均小于根结点的关键字;右子树上的所有结点的关键字均大于根结点的关键字。这样树称为二叉排序树,空二叉树是一种特殊的二叉排序树。

二叉排序树

4.4平衡二叉树

平衡二叉树是一种特殊的二叉排序树,其树上任意结点的左右子树深度之差不超过1。

<think>嗯,用户想了解Java中二叉树基本概念、定义和特性。首先,我需要回顾一下二叉树的基础知识。根据引用[3],二叉树是树的一种,每个节点最多有两个子节点,称为左子树和右子树。而且二叉树是有序的,左右子树的顺序不能颠倒,这点和普通树不同。 接下来,定义方面,引用[4]提到,二叉树可以是空的,或者由一个节点和两个互不相交的左右子树组成。这个递归定义很关键,因为二叉树的很多操作都是递归实现的,比如遍历。 特性方面,用户可能想知道二叉树的独特之处。比如,每个节点最多两个子节点,这是基本特性。此外,二叉树的层次结构也很重要,根节点在第一层,子节点依次向下。引用[4]还提到二叉树的有序性,左右子树的位置不能交换,这影响了遍历和插入操作。 然后,需要结合Java的实现。比如,如何定义一个二叉树节点类。通常会有数据域和左右子节点的引用,这部分应该用代码示例来说明,如引用[1]中的Java代码示例可能涉及节点类的结构。需要确保代码正确,比如构造函数和字段的访问权限。 另外,二叉树的类型可能也需要提及,比如满二叉树、完全二叉树,这些在引用中没有直接提到,但根据常识,这些是基本分类,可以补充说明。但要注意引用内容是否覆盖这些,如果引用中没有,可能需要避免添加额外信息,或者明确说明是扩展内容。 用户的问题集中在基本概念,所以重点放在定义、特性、结构,以及Java中的表示方法。需要引用相关的引用来源,比如引用[3]和[4]详细说明了定义和特性,而引用[1]和[2]可能涉及Java的具体实现。 最后,生成相关问题的时候,要确保问题与内容相关,比如遍历方法、应用场景、实现细节等,参考用户提供的示例问题结构。</think>### Java 二叉树基本概念解析 #### 一、定义与核心特性 1. **基本定义** 二叉树是由$n(n \geq 0)$个节点构成的有限集合,可能为空(空二叉树),或包含: - 一个**根节点** - 两个互不相交的子树(左子树和右子树)[^4] *示例代码结构*: ```java class TreeNode { int val; TreeNode left; // 左子节点引用 TreeNode right; // 右子节点引用 TreeNode(int x) { val = x; } } ``` 2. **关键特性** - **有序性**:左右子树严格区分,顺序不可颠倒 - **递归结构**:每个子树本身也是二叉树[^3] - **节点限制**:每个节点最多有两个子节点 - **层次性**:根为第一层,子节点依次向下扩展 #### 二、二叉树分类(扩展) | 类型 | 特点 | |--------------|-------------------------------| | 满二叉树 | 所有非叶节点均有2个子节点 | | 完全二叉树 | 除最后一层外,其他层均填满 | | 二叉搜索树 | 左子树值 ≤ 根 ≤ 右子树值 | #### 三、Java实现要点 1. **节点表示** 通过类定义实现树节点,包含数据域和子节点引用(如上述`TreeNode`类)[^1] 2. **操作复杂度** - 查找/插入:$O(\log n)$(平衡时)→ $O(n)$(退化为链表时) - 遍历:$O(n)$(需访问所有节点) #### 四、应用场景 1. 数据快速检索(如二叉搜索树) 2. 表达式树(编译器中用于语法分析) 3. 哈夫曼编码(数据压缩)[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值