本文系转载出处:https://blog.csdn.net/theonegis/article/details/44223247
给定二叉树的初始化数据,怎样动态建立一个二叉树呢?
比如我们给定这样的一组数据:{ 1, 2, 3, 4, 0, 5, 6, 0, 7 }(假设0代表空),则我们构建的二叉树是按层次初始化的,例如:
我们可以使用一个队列,队首出一个元素,队未进两个元素,而这两个元素正好是这个队首元素的左右节点。
#include <iostream>
#include <queue>
using namespace std;
class TreeNode{
public:
int data;
struct TreeNode *left, *right;
TreeNode(int x):data(x),left(nullptr),right(nullptr){};//initialize
struct TreeNode* init_tree(int [],int );
//初始化一个二叉树
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);
};
void preOrder(TreeNode *root, vector<int> &result)
{
if (root)
{
result.push_back(root->data);
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->data);
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->data);
}
}
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;
}
TreeNode* init_tree(int ele[],int size)
{
if(size<1)
{
return nullptr;
}
TreeNode **nodes = new TreeNode*[size];
for(int i = 0;i<size;i++)
{
if(ele[i]==0)
{
nodes[i]=nullptr;
}
else
{
nodes[i] = new TreeNode(ele[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];
}
int main()
{
int nums[] = { 1, 2, 3, 4, 0, 5, 6, 0, 7 };
TreeNode *root = init_tree(nums, sizeof(nums)/sizeof(int));
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;
}