struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
//初始化二叉树
TreeNode* initBTree(int elements[], int size)
{
if (size < 1)
{
return NULL;
}
if (size == 1 && elements[0] == 0) return NULL;
cout << "开始创建" << endl;
//动态申请size大小的指针数组
TreeNode** nodes = new TreeNode * [size];
//将int数据转换为TreeNode节点
for (int i = 0; i < size; i++)
{
if (elements[i] == 0)
{
nodes[i] = nullptr;
}
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();
TreeNode* lnode= nodes[index++];
if (lnode != nullptr)
{
nodeQueue.push(lnode);
node->left = lnode;
}
if (index == size) break;
TreeNode* rnode = nodes[index++];
if (rnode != nullptr)
{
nodeQueue.push(rnode);
node->right = rnode;
}
}
return nodes[0];
}
//打印二叉树
void printTree(TreeNode* root)
{
cout << "开始打印二叉树" << endl;
if (root == nullptr)
{
cout << "二叉树为空" << endl;
return;
}
queue<TreeNode*> que;
que.push(root);
int bottomLeft = 0;
while (!que.empty()) {
int size = que.size();
bool flag = 0;
for (int i = 0; i < size; ++i) {
TreeNode* node = que.front();
que.pop();
cout << "节点" << node->val;
if (node->left != nullptr)
{
cout << "的左节点为 " << node->left->val << endl;
if (node->left != nullptr)
que.push(node->left);
}
if (node->right != nullptr) {
cout << " 右节点为 " << node->right->val << endl;
if (node->right != nullptr)
que.push(node->right);
}
cout << endl;
}
}
}
//释放二叉树内存
void Free_PreOrderTraverse(TreeNode* root)
{
if (root!=nullptr)
{
TreeNode* lchild = root->left;
TreeNode* rchild = root->right;
free(root);
Free_PreOrderTraverse(lchild);
Free_PreOrderTraverse(rchild);
}
}
void main()
{
int elements[] = { 1, 2, 3, 4, 0, 5, 6, 0,0, 7 };
cout << "节点的数量为" << sizeof(elements) / sizeof(int) << endl;
TreeNode* node = initBTree(elements, sizeof(elements) / sizeof(int));
//打印树
printTree(node);
//释放内存
Free_PreOrderTraverse(node);
}