二叉树的初始化
来源:互联网 发布:小刀网软件下载 编辑:程序博客网 时间:2024/05/13 17:44
问题:
给定二叉树的初始化数据,怎样动态建立一个二叉树呢?
比如我们给定这样的一组数据:{ 1, 2, 3, 4, 0, 5, 6, 0, 7 }(假设0代表空),则我们构建的二叉树是这样的:
1 / \ 2 3 / / \ 4 5 6 \ 7
思路分析:
我们可以使用一个队列,队首出一个元素,队未进两个元素,而这两个元素正好是这个队首元素的左右节点。
参考代码如下:
TreeNode* initBTree(int elements[], int size){if (size < 1){return NULL;}//动态申请size大小的指针数组TreeNode **nodes = new TreeNode*[size];//将int数据转换为TreeNode节点for (int i = 0; i < size; i++){if (elements[i] == 0){nodes[i] = NULL;}else{nodes[i] = new TreeNode(elements[i]);}}queue<TreeNode*> nodeQueue;nodeQueue.push(nodes[0]);TreeNode *node;int index = 1;while (index < size){node = nodeQueue.front();nodeQueue.pop();nodeQueue.push(nodes[index++]);node->left = nodeQueue.back();nodeQueue.push(nodes[index++]);node->right = nodeQueue.back();}return nodes[0];}
下面是一个测试代码,我们可以看看结果:
头文件声明(tree.h):
#pragma once#include <iostream>#include <vector>#include <queue>using namespace std;//Definition for binary treestruct TreeNode{int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}};//初始化一个二叉树TreeNode* initBTree(int elements[], int size);//树的前序遍历void preOrder(TreeNode *root, vector<int> &result);//树的中序遍历void inOrder(TreeNode *root, vector<int> &result);//树的后序遍历void postOrder(TreeNode *root, vector<int> &result);//vector的遍历void traverse(vector<int> nums);
源代码实现:
#include "tree.h"TreeNode* initBTree(int elements[], int size){if (size < 1){return NULL;}//动态申请size大小的指针数组TreeNode **nodes = new TreeNode*[size];//将int数据转换为TreeNode节点for (int i = 0; i < size; i++){if (elements[i] == 0){nodes[i] = NULL;}else{nodes[i] = new TreeNode(elements[i]);}}queue<TreeNode*> nodeQueue;nodeQueue.push(nodes[0]);TreeNode *node;int index = 1;while (index < size){node = nodeQueue.front();nodeQueue.pop();nodeQueue.push(nodes[index++]);node->left = nodeQueue.back();nodeQueue.push(nodes[index++]);node->right = nodeQueue.back();}return nodes[0];}void preOrder(TreeNode *root, vector<int> &result){if (root){result.push_back(root->val);preOrder(root->left, result);preOrder(root->right, result);}}void inOrder(TreeNode *root, vector<int> &result){if (root){inOrder(root->left, result);result.push_back(root->val);inOrder(root->right, result);}}void postOrder(TreeNode *root, vector<int> &result){if (root){postOrder(root->left, result);postOrder(root->right, result);result.push_back(root->val);}}void traverse(vector<int> nums){vector<int>::size_type size = nums.size();for (size_t i = 0; i < size; i++){cout << nums[i] << ' ';}cout << endl;}int main(){int nums[] = { 1, 2, 3, 4, 0, 5, 6, 0, 7 };TreeNode *root = initBTree(nums, 9);vector<int> preResult;vector<int> inResult;vector<int> postResult;preOrder(root, preResult);inOrder(root, inResult);postOrder(root, postResult);cout << "前序遍历的结果:" << '\n';traverse(preResult);cout << "中序遍历的结果:" << '\n';traverse(inResult);cout << "后序遍历的结果:" << '\n';traverse(postResult);return 0;}
运行结果如下:
0 0
- 二叉树的初始化
- 搜索二叉树的初始化
- 二叉树的初始化及遍历
- 递归初始化二叉树
- 二叉树初始化
- 二叉树的初始化及其添加和遍历JAVA
- 二叉查找树初始化与插入算法
- C++实现二叉树(初始化,删除,遍历)
- 二叉查找树 各种操作及其初始化
- 二叉树初始化及三种遍历方法
- 二叉树(一)利用数组初始化二叉树,并实现前序中序后序遍历
- 二叉树的各种遍历,二叉树改链表,二叉树复习
- 二叉树的宽度(二叉树)
- 数据结构【二叉树】 二叉树的创建
- 二叉树------二叉查找树的相关内容
- 二叉树------二叉树的下一个结点
- 二叉树及特殊的二叉树
- 二叉树的深度(二叉树)
- TiXmlDocument和Char的导入和导出
- Git--Submodule的用法
- 动态代理(JDK)实现原理
- HBase技术介绍
- 看好你的门-攻击服务端(5)-对HTTP参数污染进行攻击
- 二叉树的初始化
- Android基础&进阶
- Android Material Design之Toolbar与Palette实践
- uva 116 (记忆化搜索)
- Windows 内存管理方法(三)
- 本地eclipse连接远程hadoop集群运行wordcount实例,实现远程调试
- 开博
- window mysql控制台 导入大数据库 报command ,sql connnect error 等错的解决方法
- Java类加载器原理分析