二叉树的基本操作算法实现C语言代码
时间: 2023-08-10 15:08:46 浏览: 69
### 回答1:
二叉树的基本操作包括创建二叉树、遍历二叉树、插入节点、删除节点等。以下是二叉树的基本操作算法实现的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
//定义二叉树结点结构体
typedef struct Node{
int data;
struct Node *left;
struct Node *right;
}Node;
//创建二叉树
Node* create(){
int data;
Node *p=NULL;
scanf("%d",&data);
if(data==-1){
return NULL;
}
else{
p=(Node *)malloc(sizeof(Node));
p->data=data;
p->left=create();
p->right=create();
}
return p;
}
//前序遍历二叉树
void preOrder(Node *root){
if(root!=NULL){
printf("%d ",root->data);
preOrder(root->left);
preOrder(root->right);
}
}
//中序遍历二叉树
void inOrder(Node *root){
if(root!=NULL){
inOrder(root->left);
printf("%d ",root->data);
inOrder(root->right);
}
}
//后序遍历二叉树
void postOrder(Node *root){
if(root!=NULL){
postOrder(root->left);
postOrder(root->right);
printf("%d ",root->data);
}
}
//插入节点
Node* insert(Node *root,int x){
if(root==NULL){
root=(Node *)malloc(sizeof(Node));
root->data=x;
root->left=NULL;
root->right=NULL;
}
else{
if(x<root->data){
root->left=insert(root->left,x);
}
else if(x>root->data){
root->right=insert(root->right,x);
}
}
return root;
}
//查找二叉树中的最小值
Node* findMin(Node *root){
if(root==NULL){
return NULL;
}
else if(root->left==NULL){
return root;
}
else{
return findMin(root->left);
}
}
//删除节点
Node* delete(Node *root,int x){
Node *temp=NULL;
if(root==NULL){
printf("Element not found\n");
}
else if(x<root->data){
root->left=delete(root->left,x);
}
else if(x>root->data){
root->right=delete(root->right,x);
}
else{
if(root->left && root->right){
temp=findMin(root->right);
root->data=temp->data;
root->right=delete(root->right,root->data);
}
else{
temp=root;
if(root->left==NULL){
root=root->right;
}
else if(root->right==NULL){
root=root->left;
}
free(temp);
}
}
return root;
}
int main(){
Node *root=NULL;
int choice,x;
while(1){
printf("\nMenu\n");
printf("1. Create Binary Tree\n");
printf("2. Insert Node\n");
printf("3. Delete Node\n");
printf("4. Pre-order Traversal\n");
printf("5. In-order Traversal\n");
printf("6. Post-order Traversal\n");
printf("7. Exit\n");
printf("Enter your choice: ");
scanf("%d",&choice);
switch(choice){
case 1:
printf("Enter data of root node: ");
root=create();
break;
case 2:
printf("Enter data of node to be inserted: ");
scanf("%d",&x);
root=insert(root,x);
break;
case 3:
printf("Enter data of node to be deleted: ");
scanf("%d",&x);
root=delete(root,x);
break;
case 4:
printf("Pre-order Traversal: ");
preOrder(root);
break;
case 5:
printf("In-order Traversal: ");
inOrder(root);
break;
case 6:
printf("Post-order Traversal: ");
postOrder(root);
break;
case 7:
exit(0);
default:
printf("Invalid choice\n");
}
}
return 0;
}
```
以上代码实现了二叉树的创建、遍历、插入和删除操作,并通过菜单进行交互式操作。可以根据需要进行修改和扩展。
### 回答2:
二叉树是一种非常常见的数据结构,它由节点组成,每个节点最多有两个子节点。二叉树的基本操作包括插入、删除和查找。
以下是二叉树基本操作的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
struct Node {
int data; // 数据
struct Node* left; // 左子节点指针
struct Node* right; // 右子节点指针
};
// 创建新节点函数
struct Node* newNode(int data) {
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
// 插入节点函数
struct Node* insert(struct Node* root, int data) {
// 如果二叉树为空,直接创建新节点作为根节点
if (root == NULL) {
return newNode(data);
}
// 否则,递归地插入节点
if (data < root->data) {
root->left = insert(root->left, data);
} else if (data > root->data) {
root->right = insert(root->right, data);
}
return root;
}
// 删除节点函数
struct Node* delete(struct Node* root, int data) {
// 如果二叉树为空,直接返回
if (root == NULL) {
return root;
}
// 否则,递归地删除节点
if (data < root->data) {
root->left = delete(root->left, data);
} else if (data > root->data) {
root->right = delete(root->right, data);
} else {
// 找到需要删除的节点
if (root->left == NULL && root->right == NULL) {
// 如果该节点没有子节点,直接删除
free(root);
root = NULL;
} else if (root->left == NULL) {
// 如果该节点只有右子节点,将右子节点替代该节点
struct Node* temp = root;
root = root->right;
free(temp);
} else if (root->right == NULL) {
// 如果该节点只有左子节点,将左子节点替代该节点
struct Node* temp = root;
root = root->left;
free(temp);
} else {
// 如果该节点有两个子节点,找到右子树的最小节点,将最小节点替换为该节点,然后删除最小节点
struct Node* min = findMin(root->right);
root->data = min->data;
root->right = delete(root->right, min->data);
}
}
return root;
}
// 查找最小节点函数
struct Node* findMin(struct Node* root) {
while (root->left != NULL) {
root = root->left;
}
return root;
}
// 查找节点函数
struct Node* search(struct Node* root, int data) {
// 如果二叉树为空或者找到了目标节点,返回该节点
if (root == NULL || root->data == data) {
return root;
}
// 否则,递归地查找节点
if (data < root->data) {
return search(root->left, data);
} else {
return search(root->right, data);
}
}
// 主函数
int main() {
struct Node* root = NULL;
root = insert(root, 5);
root = insert(root, 3);
root = insert(root, 7);
root = insert(root, 1);
root = insert(root, 4);
printf("查找节点:");
struct Node* found = search(root, 7);
if (found != NULL) {
printf("%d\n", found->data);
} else {
printf("未找到\n");
}
printf("删除节点:");
root = delete(root, 3);
found = search(root, 3);
if (found != NULL) {
printf("未成功删除\n");
} else {
printf("删除成功\n");
}
return 0;
}
```
上述代码中,我们定义了一个用于表示二叉树节点的结构体,其中包含了数据以及左右子节点的指针。通过创建新节点、插入节点、删除节点、查找节点等基本操作,可以方便地对二叉树进行操作和管理。在主函数中,我们演示了如何插入节点、查找节点以及删除节点。
### 回答3:
二叉树的基本操作算法实现C语言代码如下:
```c
#include<stdio.h>
#include<stdlib.h>
// 二叉树结点定义
struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
};
// 创建新结点
struct TreeNode* createNode(int data) {
struct TreeNode* newNode = malloc(sizeof(struct TreeNode));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 插入结点
struct TreeNode* insertNode(struct TreeNode* root, int data) {
if (root == NULL) {
return createNode(data);
} else {
if (data < root->data) {
root->left = insertNode(root->left, data);
} else if (data > root->data) {
root->right = insertNode(root->right, data);
} else {
printf("该结点已存在\n");
}
}
return root;
}
// 查找结点
struct TreeNode* searchNode(struct TreeNode* root, int data) {
if (root == NULL || root->data == data) {
return root;
}
if (data < root->data) {
return searchNode(root->left, data);
} else {
return searchNode(root->right, data);
}
}
// 删除结点
struct TreeNode* deleteNode(struct TreeNode* root, int data) {
if (root == NULL) {
return root;
}
if (data < root->data) {
root->left = deleteNode(root->left, data);
} else if (data > root->data) {
root->right = deleteNode(root->right, data);
} else {
// 找到要删除的结点
if (root->left == NULL) {
struct TreeNode* temp = root->right;
free(root);
return temp;
} else if (root->right == NULL) {
struct TreeNode* temp = root->left;
free(root);
return temp;
}
struct TreeNode* temp = root->right;
while (temp->left != NULL) {
temp = temp->left;
}
root->data = temp->data;
root->right = deleteNode(root->right, temp->data);
}
return root;
}
// 中序遍历
void inorderTraversal(struct TreeNode* root) {
if (root != NULL) {
inorderTraversal(root->left);
printf("%d ", root->data);
inorderTraversal(root->right);
}
}
int main() {
struct TreeNode* root = NULL;
root = insertNode(root, 50);
insertNode(root, 30);
insertNode(root, 20);
insertNode(root, 40);
insertNode(root, 70);
insertNode(root, 60);
insertNode(root, 80);
printf("中序遍历二叉树:");
inorderTraversal(root);
printf("\n");
printf("删除结点后中序遍历二叉树:");
root = deleteNode(root, 40);
inorderTraversal(root);
printf("\n");
return 0;
}
```
该代码实现了二叉树的基本操作算法,包括创建新结点、插入结点、查找结点、删除结点和中序遍历等操作。测试了插入结点和删除结点后的中序遍历结果。运行结果如下:
```
中序遍历二叉树:20 30 40 50 60 70 80
删除结点后中序遍历二叉树:20 30 50 60 70 80
```
注意,此处是二叉搜索树的实现,对于普通的二叉树,插入、删除和查找操作的实现可能有所不同。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_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)