输入一串数字建立完全二叉树
时间: 2023-10-10 14:13:23 浏览: 97
建立完全二叉树的步骤如下:
1. 将输入的一串数字按照顺序插入到完全二叉树中,从根节点开始插入,每次插入到一个节点时,按照从上到下、从左到右的顺序进行插入。
2. 如果插入的节点的父节点不存在,则该节点为根节点。如果插入的节点的父节点存在,则该节点为父节点的左子节点或右子节点。
3. 如果插入的节点是左子节点,则该节点的编号为父节点编号的两倍;如果插入的节点是右子节点,则该节点的编号为父节点编号的两倍加一。
4. 如果所有的数字都插入完毕,则建立完全二叉树完成。
举个例子,输入的数字为:1, 2, 3, 4, 5, 6, 7,建立出的完全二叉树如下:
```
1
/ \
2 3
/ \ / \
4 5 6 7
```
相关问题
建立完全二叉树C++
在C++中,可以使用指针和动态内存分配来建立完全二叉树。完全二叉树是一种特殊的二叉树,除了最后一层外,其他层的节点都是满的,并且最后一层的节点都尽量靠左排列。
下面是一个建立完全二叉树的示例代码:
```cpp
#include <iostream>
#include <queue>
using namespace std;
// 定义二叉树节点结构
struct TreeNode {
int data;
TreeNode* left;
TreeNode* right;
};
// 创建新节点
TreeNode* createNode(int data) {
TreeNode* newNode = new TreeNode();
if (!newNode) {
cout << "内存分配失败!" << endl;
return NULL;
}
newNode->data = data;
newNode->left = newNode->right = NULL;
return newNode;
}
// 建立完全二叉树
TreeNode* createCompleteBinaryTree(int arr[], int size) {
if (size == 0) {
return NULL;
}
// 创建根节点
TreeNode* root = createNode(arr[0]);
// 使用队列辅助进行层序遍历
queue<TreeNode*> q;
q.push(root);
// 从数组的第二个元素开始,依次创建节点并连接到二叉树中
for (int i = 1; i < size; i++) {
TreeNode* currentNode = q.front();
q.pop();
// 创建左子节点
currentNode->left = createNode(arr[i]);
q.push(currentNode->left);
// 如果数组还有剩余元素,则创建右子节点
if (i < size - 1) {
currentNode->right = createNode(arr[i + 1]);
q.push(currentNode->right);
i++; // 因为右子节点已经被创建,所以需要跳过下一个元素
}
}
return root;
}
// 层序遍历二叉树
void levelOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* currentNode = q.front();
q.pop();
cout << currentNode->data << " ";
if (currentNode->left) {
q.push(currentNode->left);
}
if (currentNode->right) {
q.push(currentNode->right);
}
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5, 6, 7};
int size = sizeof(arr) / sizeof(arr[0]);
TreeNode* root = createCompleteBinaryTree(arr, size);
cout << "完全二叉树的层序遍历结果为:";
levelOrderTraversal(root);
return 0;
}
```
这段代码中,我们首先定义了一个`TreeNode`结构体来表示二叉树的节点。然后,我们使用`createNode`函数来创建新的节点,并使用`createCompleteBinaryTree`函数来建立完全二叉树。在`createCompleteBinaryTree`函数中,我们使用队列来辅助进行层序遍历,并依次创建节点并连接到二叉树中。最后,我们使用`levelOrderTraversal`函数来进行层序遍历并输出结果。
用c++建立一个完全二叉树
用C语言建立一个完全二叉树的过程如下:
1. 定义结构体Node,表示二叉树节点的结构体。该结构体包含三个成员变量:一个整数值data,以及两个指向左右子节点的指针left和right。
```
struct Node {
int data;
struct Node *left;
struct Node *right;
};
```
2. 定义一个函数createNode,负责创建新节点并初始化。该函数接受一个整数值作为参数,返回一个指向新节点的指针。
```
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
```
3. 定义一个函数insertNode,负责向完全二叉树中插入新节点。该函数接受三个参数:一个指向根节点的指针root,一个表示新节点要插入的位置的二进制整数index,以及一个表示新节点的值的整数data。
```
void insertNode(struct Node** root, int index, int data) {
if (*root == NULL) {
*root = createNode(data);
return;
}
int height = floor(log2(index + 1));
int mask = (1 << height) - 1;
int parentIndex = (index & ~mask) >> 1;
struct Node* parent = *root;
for (int i = height - 2; i >= 0; i--) {
if (parent == NULL) {
return;
}
if ((parentIndex & (1 << i)) == 0) {
parent = parent->left;
} else {
parent = parent->right;
}
}
if (parent == NULL) {
return;
}
struct Node* newNode = createNode(data);
if ((index & 1) == 0) {
parent->left = newNode;
} else {
parent->right = newNode;
}
}
```
4. 在主函数中,声明一个指向根节点的指针root。调用insertNode函数来插入新节点。
```
int main() {
struct Node* root = NULL;
insertNode(&root, 0, 1);
insertNode(&root, 1, 2);
insertNode(&root, 2, 3);
insertNode(&root, 3, 4);
insertNode(&root, 4, 5);
insertNode(&root, 5, 6);
return 0;
}
```
5. 完成后,该程序会生成一个如下显示的完全二叉树:
```
1
/ \
2 3
/ \ /
4 5 6
```
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)