基于数组存储的完全二叉树打印实现问询
基于数组实现完全二叉树的打印方案
完全二叉树天生就适配数组存储,不用链表节点完全没问题!我来给你详细拆解实现思路,附可运行的代码示例。
核心原理:数组与二叉树节点的对应规则
首先得明确数组下标和树节点的映射关系,这是实现的基础,有两种常用的索引方式:
- 下标从1开始(推荐,计算更直观):
- 根节点在索引1的位置
- 任意节点
i的左孩子是2*i,右孩子是2*i + 1 - 任意节点
i的父节点是i // 2(整数除法)
- 下标从0开始:
- 根节点在索引0的位置
- 任意节点
i的左孩子是2*i + 1,右孩子是2*i + 2 - 任意节点
i的父节点是(i - 1) // 2
下面的示例我会用下标从1开始的方式,如果你手里的数组是0开始的,只需要在数组前面加一个占位元素(比如None)就能轻松转换。
实现思路:按层打印+格式对齐
要把数组元素打印成清晰的树状结构,核心是按层序遍历输出,同时处理好每层的缩进和节点间距:
- 计算树的高度:确定二叉树的层级数,这是计算缩进和间距的基础
- 逐层处理:遍历每一层,确定该层的起始、结束索引
- 美化格式:根据当前层的位置,计算前置缩进和节点间的空格,让上层节点对齐下层两个节点的中间位置
代码示例(Python)
def print_complete_binary_tree(arr): # 转换为下标从1开始的数组(适配原数组0开始的情况) if arr[0] is not None: arr = [None] + arr n = len(arr) - 1 # 实际元素个数 if n == 0: print("空树") return # 计算树的高度(不用math库的写法) h = 0 temp = n while temp > 0: temp = temp // 2 h += 1 # 控制每个节点的显示宽度(可根据元素类型调整) node_width = len(str(max(arr[1:]))) + 2 # 预留边距,避免元素长度不一打乱对齐 for level in range(1, h + 1): # 当前层的起始和结束索引 start_idx = 2 ** (level - 1) end_idx = min(2 ** level - 1, n) # 计算前置缩进:每往上一层,缩进是下层间距的一半 indent = (2 ** (h - level) - 1) * node_width // 2 print(' ' * indent, end='') # 计算当前层节点之间的间距 if level < h: gap = (2 ** (h - level + 1) - 1) * node_width // 2 else: gap = node_width # 最底层节点直接用节点宽度作为间距 # 打印当前层所有节点 for i in range(start_idx, end_idx + 1): print(f"{arr[i]:^{node_width}}", end=' ' * (gap - node_width)) print() # 每层结束换行 # 测试用例 if __name__ == "__main__": # 7个元素的完全二叉树 test_arr1 = [1, 2, 3, 4, 5, 6, 7] print("7元素完全二叉树:") print_complete_binary_tree(test_arr1) # 3个元素的完全二叉树 print("\n--- 3元素完全二叉树 ---") test_arr2 = [10, 20, 30] print_complete_binary_tree(test_arr2)
代码说明
- 索引转换:自动把0开始的数组转为1开始,简化节点关系计算
- 树高计算:用循环替代对数库,兼容性更好
- 格式控制:
node_width保证不同长度的元素不会打乱对齐,缩进和间距的计算完全贴合完全二叉树的层级特性,让结构更直观 - 边界处理:自动适配空树、单节点树、最后一层节点不满的情况
内容的提问来源于stack exchange,提问作者kala Mask
相关产品推荐
相关产品推荐

