用c语言实现完全二叉树的遍历
时间: 2023-10-23 18:14:32 浏览: 78
完全二叉树是一种特殊的二叉树,要求从上到下、从左到右依次填满所有节点。以下是用 C 语言实现完全二叉树的遍历代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 创建新节点
TreeNode* createNode(int data) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 将节点插入完全二叉树中
void insertNode(TreeNode* root, int data, int index, int totalNodes) {
if (index > totalNodes) {
printf("Error: Index out of range!\n");
return;
}
if (root == NULL) {
printf("Error: Root node cannot be NULL!\n");
return;
}
// 计算要插入的节点在二叉树中的位置
int level = 1;
while (index > 1) {
level++;
index /= 2;
}
TreeNode* node = root;
for (int i = level - 2; i >= 0; i--) {
if ((index >> i) & 1) {
node = node->right;
} else {
node = node->left;
}
if (node == NULL) {
printf("Error: Parent node cannot be NULL!\n");
return;
}
}
// 创建新节点并插入到二叉树中
TreeNode* newNode = createNode(data);
if ((index & 1) == 1) {
node->right = newNode;
} else {
node->left = newNode;
}
}
// 前序遍历
void preOrder(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%d ", root->data);
preOrder(root->left);
preOrder(root->right);
}
// 中序遍历
void inOrder(TreeNode* root) {
if (root == NULL) {
return;
}
inOrder(root->left);
printf("%d ", root->data);
inOrder(root->right);
}
// 后序遍历
void postOrder(TreeNode* root) {
if (root == NULL) {
return;
}
postOrder(root->left);
postOrder(root->right);
printf("%d ", root->data);
}
int main() {
int totalNodes = 7;
TreeNode* root = createNode(1);
insertNode(root, 2, 2, totalNodes);
insertNode(root, 3, 3, totalNodes);
insertNode(root, 4, 4, totalNodes);
insertNode(root, 5, 5, totalNodes);
insertNode(root, 6, 6, totalNodes);
insertNode(root, 7, 7, totalNodes);
printf("前序遍历:");
preOrder(root);
printf("\n");
printf("中序遍历:");
inOrder(root);
printf("\n");
printf("后序遍历:");
postOrder(root);
printf("\n");
return 0;
}
```
以上代码实现了完全二叉树的节点插入和三种遍历方式:前序遍历、中序遍历和后序遍历。其中,insertNode() 函数实现了节点插入操作,preOrder()、inOrder() 和 postOrder() 函数分别用于前序遍历、中序遍历和后序遍历。
阅读全文