19 顺序存储二叉树

文章介绍了顺序存储二叉树的概念,强调这种存储方式主要应用于完全二叉树。数组arr[1,2,3,4,5,6,7]能表示特定的二叉树结构,其中第n个元素的左子节点是2*n+1,右子节点是2*n+2,父节点是(n-1)/2。文章还提到,通过这种方式,仍能实现前序、中序和后序遍历。

1 顺序存储二叉树的概念

从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,看右面的示意图。

在这里插入图片描述

要求:
1) 右图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6]
2) 要求在遍历数组 arr 时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历

顺序存储二叉树的特点:
1) 顺序二叉树通常只考虑完全二叉树
2) 第 n 个元素的左子节点为 2 * n + 1
3) 第 n 个元素的右子节点为 2 * n + 2
4) 第 n 个元素的父节点为 (n-1) / 2
5) n : 表示二叉树中的第几个元素(按 0 开始编号如图所示)

### 折半查找算法简介 折半查找(Binary Search),是一种高效的查找方法,适用于已经按照关键字有序排列的数据集合。该算法通过不断缩小待查范围的方式减少比较次数,从而提升查找效率[^1]。 对于长度为18的顺序存储结构,假设其中的元素按升序或降序排列,可以利用折半查找算法高效定位目标值的位置或者判断目标值是否存在。 --- ### 实现过程描述 以下是针对长度为18的顺序存储结构实现折半查找的具体说明: #### 初始条件设定 定义三个指针变量 `low`、`high` 和 `mid` 来表示当前查找区间的起始位置、结束位置以及中间位置: - 初始化时,令 `low = 0` 表示数组的第一个索引; - 令 `high = n - 1` (此处 `n=18`,即最后一个元素的索引); - 计算中间位置 `mid = (low + high) // 2`。 #### 查找逻辑 在每次迭代过程中执行以下操作: 1. 如果目标值等于 `arr[mid]` 的值,则返回 `mid` 并终止查找。 2. 若目标值小于 `arr[mid]`,则更新区间上限 `high = mid - 1`,继续在左子区间 `[low, mid-1]` 中查找。 3. 若目标值大于 `arr[mid]`,则更新区间下限 `low = mid + 1`,继续在右子区间 `[mid+1, high]` 中查找。 4. 当 `low > high` 时,表明未找到目标值,退出循环并返回失败标志。 此过程重复进行直到满足上述任一停止条件为止[^2]。 --- ### Python代码实现 下面是基于Python语言编写的折半查找函数实例: ```python def binary_search(arr, target): low = 0 high = len(arr) - 1 while low <= high: mid = (low + high) // 2 if arr[mid] == target: return mid # 返回匹配项的索引 elif arr[mid] < target: low = mid + 1 else: high = mid - 1 return -1 # 如果找不到目标值,返回-1作为标记 ``` 调用以上函数时传入一个长度为18且已排序好的列表即可完成相应功能测试。 --- ### 关键字比较次数分析 当讨论最坏情况下的关键字比较次数时,需考虑的是树的高度问题。由于每一步都将原序列分成两部分处理,因此整个过程相当于构建了一棵二叉判定树。对于含有N个节点的理想平衡二叉树来说,其最大层数H=log₂(N+1)-1向上取整得到的结果就是所需的最大比较次数。 具体到题目所给定的情形——长度为18的情况之下: - **最多比较次数**:log₂(19)=ceil(log₁₀(19)/log₁₀(2))≈5次。 - **最少比较次数**:如果首次尝试就命中目标值的话只需一次比较即可得出结论。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值