数据结构-树

概述

树是一种与自然界中的树木类似的数据结构(呈现倒置形态),其中非空树有且仅有一个根节点。

树结构具有以下核心特性:

  1. 树中任意两个节点之间都存在唯一的一条连通路径
  2. 含有n个节点的树必定具有n-1条边
  3. 树结构不存在闭合环路

 

如图所示,这张图清晰地展示了树结构中的核心概念:

  1. 节点:树中的每个元素统称为节点。

  2. 根节点:位于顶层的节点,没有父节点。图中A节点即为根节点。

  3. 父节点:包含子节点的节点。例如B节点是D、E节点的父节点。

  4. 子节点:某个节点直接包含的子树根节点。图中D、E节点就是B节点的子节点。

  5. 兄弟节点:拥有相同父节点的节点。D和E节点因为都隶属于B节点,所以互为兄弟节点。

  6. 叶子节点:不包含任何子节点的末端节点。图中D、F、H、I都属于叶子节点。

  7. 节点高度:从该节点到最远叶子节点路径上的边数。

  8. 节点深度:从根节点到该节点路径上的边数。

  9. 节点层数:节点的深度值加1。

  10. 树的高度:根节点的高度值。

基本概念

  • 结点:树的基本单位,包含数据元素和指向子树的指针。

    • 结点的度:子树的数目。

    • 树的度:所有结点度的最大值。

  • 特殊结点

    • 叶子结点:度为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;
    } 

二叉树的性质

二叉树的基本特性

  1. 单层最大结点数

    • 第i层最多有 2^(i-1) 个结点(i≥1)

    • 比如第3层最多有2^(3-1)=4个结点

  2. 整树最大结点数

    • 深度为k的二叉树最多有 2^k - 1 个结点(k≥1)

    • 比如深度3的二叉树最多有2^3-1=7个结点

完全二叉树的编号特性

(对n个结点按层序编号,1≤i≤n)

结点关系条件判断结论
根结点i=1无父结点
父结点i>1⌊i/2⌋
左子结点2i ≤ n2i
右子结点2i+1 ≤ n2i+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);
}
遍历方式顺序
前序遍历根 → 左 → 右
中序遍历左 → 根 → 右
后序遍历左 → 右 → 根
层次遍历从上到下,从左到右
  • 反向构造二叉树:前序 + 中序 → 唯一确定二叉树(前序定根,中序分左右)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值