使用c语言实现结点值为字母的完全二叉树的插入、三种遍历和结点删除
时间: 2023-07-15 16:15:41 浏览: 101
以下是使用C语言实现结点值为字母的完全二叉树的插入、三种遍历和结点删除的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 创建新节点
TreeNode* createNode(char val) {
TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
// 插入节点
void insertNode(TreeNode **root, char val) {
TreeNode *node = createNode(val);
if (*root == NULL) {
*root = node;
return;
}
// 层序遍历,找到最后一个节点插入新节点
TreeNode *cur;
Queue *queue = createQueue();
enqueue(queue, *root);
while (!isEmpty(queue)) {
cur = dequeue(queue);
if (cur->left == NULL) {
cur->left = node;
break;
} else if (cur->right == NULL) {
cur->right = node;
break;
} else {
enqueue(queue, cur->left);
enqueue(queue, cur->right);
}
}
destroyQueue(queue);
}
// 前序遍历
void preorderTraversal(TreeNode *root) {
if (root == NULL) {
return;
}
printf("%c ", root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
// 中序遍历
void inorderTraversal(TreeNode *root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%c ", root->val);
inorderTraversal(root->right);
}
// 后序遍历
void postorderTraversal(TreeNode *root) {
if (root == NULL) {
return;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%c ", root->val);
}
// 删除节点
void deleteNode(TreeNode **root, char val) {
if (*root == NULL) {
return;
}
if ((*root)->val == val) {
TreeNode *temp;
if ((*root)->left == NULL) {
temp = *root;
*root = (*root)->right;
free(temp);
} else if ((*root)->right == NULL) {
temp = *root;
*root = (*root)->left;
free(temp);
} else {
TreeNode *minNode = (*root)->right;
while (minNode->left != NULL) {
minNode = minNode->left;
}
(*root)->val = minNode->val;
deleteNode(&(*root)->right, minNode->val);
}
} else if ((*root)->val > val) {
deleteNode(&(*root)->left, val);
} else {
deleteNode(&(*root)->right, val);
}
}
int main() {
TreeNode *root = NULL;
insertNode(&root, 'A');
insertNode(&root, 'B');
insertNode(&root, 'C');
insertNode(&root, 'D');
insertNode(&root, 'E');
printf("Preorder Traversal: ");
preorderTraversal(root);
printf("\n");
printf("Inorder Traversal: ");
inorderTraversal(root);
printf("\n");
printf("Postorder Traversal: ");
postorderTraversal(root);
printf("\n");
deleteNode(&root, 'B');
printf("After Deleting 'B': ");
inorderTraversal(root);
printf("\n");
return 0;
}
```
在这个示例代码中,我们定义了一个 `TreeNode` 结构体,表示二叉树的节点。`createNode` 函数用于创建新节点,`insertNode` 函数用于插入新节点,这里采用层序遍历的方式找到最后一个节点进行插入。`preorderTraversal`、`inorderTraversal`、`postorderTraversal` 函数分别实现前序、中序和后序遍历。`deleteNode` 函数用于删除指定节点,这里采用递归的方式进行删除。
在 `main` 函数中,我们创建了一个完全二叉树,并对它进行了三种遍历,并删除了值为 `'B'` 的节点,最后再进行一次中序遍历以验证删除操作是否成功。
阅读全文