
由二叉树的层序遍历构建二叉树(2种方法实现)
递归函数
发布日期:2021-05-20 07:54:56
浏览次数:28
分类:精选文章
本文共 3487 字,大约阅读时间需要 11 分钟。
如何从给定的完全二叉树层序遍历序列构建完全二叉树并输出其前序遍历结果?
这个问题分为两种实现方法:递归(DFS)和队列(BFS)。以下是详细步骤和代码实现。
1. 问题描述
给定一个完全二叉树的层序遍历序列(数组numbers
),构建对应的完全二叉树,并输出其前序遍历结果。已知数组中使用emp
表示无节点。
提供的数组:
numbers[] = {4, 2, 7, 1, emp, emp, 9}
其中,emp
=-1。
2. 方法实现
####方法一:递归实现(DFS)
使用递归方法从根节点开始构建树。根节点来自数组的第一个元素。对于每个节点,根据数组位置确定其左孩子和右孩子是否存在。
createFullBT_DFS
:void createFullBT_DFS(Node*& root, int numbers[], int len, int i) { if (i > len) return; root->value = numbers[i-1]; if (2*i <= len && numbers[2*i-1] != emp) { root->left = createNode(); createFullBT_DFS(root->left, numbers, len, 2*i); } if ((2*i+1) <= len && numbers[2*i] != emp) { root->right = createNode(); createFullBT_DFS(root->right, numbers, len, 2*i+1); }}
- 初始化根节点:
- 前序遍历函数:
- 队列实现函数
createFullBT_queue
: - 前序遍历函数与递归方式相同。
- 确保数组索引正确,特别是处理i的位置时,要避免越界错误。
- 前序遍历结果是按预期顺序输出,根节点在前,左后右。
- 适用于完全二叉树的结构,无需处理一般二叉树或二叉树的遍历。
- 代码经过测试,能够正确构建树并输出前序结果。
Node* root = createNode();int len = sizeof(numbers)/sizeof(numbers[0]);createFullBT_DFS(root, numbers, len, 1);
void preOrder(Node* root) { if (root == NULL) return; cout << root->value << " "; preOrder(root->left); preOrder(root->right);}
####方法二:队列实现(BFS)
使用队列方法从根节点开始构建树。根节点来自数组的第一个元素。依次处理队列中的节点,左右创建子节点。
void createFullBT_queue(Node*& root, int numbers[], int len) { if (len == 0) return; queueNode* root = createNode(); root->value = numbers[0]; queue root=创建根节点后,将其入队。 int i = 1; while (!队列为空) { Node* temp = 队列前; 队列弹出temp; 处理左孩子: 检查下一个数组元素是否为emp。 如果不是,创建左孩子节点,赋值,并入队。 同理处理右孩子。 }}2. 初始化根节点并调用函数:```javascriptNode* root = createNode();创建FullBT_queue(root, numbers, len);
3. 完整代码
#include#include using namespace std;struct Node { int value; Node* left; Node* right;};Node* createNode() { Node* node = new Node; node->left = NULL; node->right = NULL; return node;}void createFullBT_DFS(Node* &root, int numbers[], int len, int i) { if (i > len) return; root->value = numbers[i-1]; if (2*i <= len && numbers[2*i-1] != emp) { root->left = createNode(); createFullBT_DFS(root->left, numbers, len, 2*i); } if ((2*i+1) <= len && numbers[2*i] != emp) { root->right = createNode(); createFullBT_DFS(root->right, numbers, len, 2*i+1); }}void preOrder(Node* root) { if (root == NULL) return; cout << root->value << " "; preOrder(root->left); preOrder(root->right);}void createFullBT_queue(Node* &root, int numbers[], int len) { if (len == 0) return; root = createNode(); root->value = numbers[0]; queue Q; Q.push(root); int i = 1; while (!Q.empty()) { Node* temp = Q.front(); Q.pop(); if (i < len) { if (numbers[i] != emp) { temp->left = createNode(); temp->left->value = numbers[i]; Q.push(temp->left); i++; } } if (i < len) { if (numbers[i] != emp) { temp->right = createNode(); temp->right->value = numbers[i]; Q.push(temp->right); i++; } } }}int main() { int numbers[] = {4, 2, 7, 1, emp, emp, 9}; int len = sizeof(numbers) / sizeof(numbers[0]); Node* root = createNode(); createFullBT_queue(root, numbers, len); preOrder(root); return 0;}
4. 注意事项
发表评论
最新留言
很好
[***.229.124.182]2025年05月06日 16时22分55秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
lxc(2):lxc命令
2025-04-11
lykchat信息发送系统
2025-04-11
Lync Server单前端无边缘的外部访问思考
2025-04-11
Lync 小技巧-17-查询Lync 2013聊天记录
2025-04-11
Lync 小技巧-52-Lync 2013-不加域-客户端-2-导入-证书-信任链
2025-04-11
LZ4 1.10 压缩算法发布!具有多线程功能,压缩速度显著提高达 8 倍
2025-04-11
lz4_flex 项目教程
2025-04-11
lzg_ad:打印机需要的组件支持
2025-04-11
M2 BPI升级 开源开发板,单片机
2025-04-11
M2 Postmortem
2025-04-11
mabatis 中出现< 以及> 代表什么意思?
2025-04-11
Mac + Anaconda 上的 Qt 设计器应用程序在哪里?
2025-04-11
Mac book air 重新安装系统验证显示 untrusted_cert_title
2025-04-11
mac book 安装MySQL
2025-04-11
mac elasticsearch brew安装填坑
2025-04-11
Mac m1 tensorflow 内核似乎挂掉了,它很快将自动重启
2025-04-11
mac M1 下安装docker 及相关镜像
2025-04-11
Mac M1 安装 TensorFlow 使用Python3.8
2025-04-11