概述
树是一种与自然界中的树木类似的数据结构(呈现倒置形态),其中非空树有且仅有一个根节点。
树结构具有以下核心特性:
- 树中任意两个节点之间都存在唯一的一条连通路径
- 含有n个节点的树必定具有n-1条边
- 树结构不存在闭合环路
如图所示,这张图清晰地展示了树结构中的核心概念:
-
节点:树中的每个元素统称为节点。
-
根节点:位于顶层的节点,没有父节点。图中A节点即为根节点。
-
父节点:包含子节点的节点。例如B节点是D、E节点的父节点。
-
子节点:某个节点直接包含的子树根节点。图中D、E节点就是B节点的子节点。
-
兄弟节点:拥有相同父节点的节点。D和E节点因为都隶属于B节点,所以互为兄弟节点。
-
叶子节点:不包含任何子节点的末端节点。图中D、F、H、I都属于叶子节点。
-
节点高度:从该节点到最远叶子节点路径上的边数。
-
节点深度:从根节点到该节点路径上的边数。
-
节点层数:节点的深度值加1。
-
树的高度:根节点的高度值。
基本概念
-
结点:树的基本单位,包含数据元素和指向子树的指针。
-
度:
-
结点的度:子树的数目。
-
树的度:所有结点度的最大值。
-
-
特殊结点:
-
叶子结点:度为0的结点(无分支)。
-
分支结点:度不为0的结点(有分支)。
-
内部结点:除根结点以外的分支结点。
-
-
层次与高度:
-
根结点为第1层。
-
树的高度:最大层次数(总层数)。
-
二叉树
-
二叉树:n(n≥0)个结点的有限集合,满足:
-
空树(n=0)。
-
由一个根结点和两棵互不相交的左子树、右子树构成(递归定义)。
-
-
特殊二叉树:
-
满二叉树:
-
所有非叶子结点的度为2,且所有叶子结点在同一层。
-
简单来说,就是每一层的节点数都达到最大值
-
-
完全二叉树:
-
除最后一层外,其他层结点数达到最大值,且最后一层结点从左向右连续排列。
-
-
单支树:
-
所有结点只有左子树或右子树。
-
-
二叉树的存储结构
-
顺序存储:
-
方式一:直接存储结点值(无法还原树结构,摒弃)。
-
方式二:按层序编号存储(可还原,但空间浪费)。
-
结点
i
的父结点:⌊i/2⌋
。 -
左子结点:
2i
(若2i ≤ n
)。 -
右子结点:
2i + 1
(若2i + 1 ≤ n
)。
-
-
-
-
链式存储:
class TreeNode { int data; private TreeNode left, right; }
二叉树的性质
二叉树的基本特性
-
单层最大结点数:
-
第i层最多有 2^(i-1) 个结点(i≥1)
-
比如第3层最多有2^(3-1)=4个结点
-
-
整树最大结点数:
-
深度为k的二叉树最多有 2^k - 1 个结点(k≥1)
-
比如深度3的二叉树最多有2^3-1=7个结点
-
完全二叉树的编号特性
(对n个结点按层序编号,1≤i≤n)
结点关系 | 条件判断 | 结论 |
---|---|---|
根结点 | i=1 | 无父结点 |
父结点 | i>1 | ⌊i/2⌋ |
左子结点 | 2i ≤ n | 2i |
右子结点 | 2i+1 ≤ n | 2i+1 |
叶子结点 | 2i > n | 无子结点 |
记忆技巧:
-
父结点位置 = 当前编号/2(向下取整)
-
子结点位置 = 当前编号×2(左)或 ×2+1(右)
完全二叉树的深度计算
-
深度 = ⌊log₂n⌋ + 1
-
示例:n=7时,深度=⌊log₂7⌋+1=3
二叉树的遍历
//先序
public void preOrder(TreeNode root){
if(root == null){
return;
}
system.out.println(root.data);
preOrder(root.left);
preOrder(root.right);
}
//中序
public void inOrder(TreeNode root){
if(root == null){
return;
}
inOrder(root.left);
system.out.println(root.data);
inOrder(root.right);
}
//后序
public void postOrder(TreeNode root){
if(root == null){
return;
}
postOrder(root.left);
postOrder(root.right);
system.out.println(root.data);
}
遍历方式 | 顺序 |
---|---|
前序遍历 | 根 → 左 → 右 |
中序遍历 | 左 → 根 → 右 |
后序遍历 | 左 → 右 → 根 |
层次遍历 | 从上到下,从左到右 |
-
反向构造二叉树:前序 + 中序 → 唯一确定二叉树(前序定根,中序分左右)。