c语言实现链式二叉树的基本操作
时间: 2023-09-11 07:06:23 浏览: 54
链式二叉树的基本操作包括创建、遍历、插入、删除等。
下面是C语言实现链式二叉树的基本操作示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结构体
typedef struct TreeNode{
int data;
struct TreeNode *left;
struct TreeNode *right;
}TreeNode, *Tree;
// 创建二叉树
void createTree(Tree *t){
int data;
scanf("%d", &data);
if(data == -1){ // 输入-1表示该节点为空
*t = NULL;
}else{
*t = (Tree)malloc(sizeof(TreeNode));
(*t)->data = data;
createTree(&((*t)->left)); // 递归创建左子树
createTree(&((*t)->right)); // 递归创建右子树
}
}
// 先序遍历
void preOrder(Tree t){
if(t != NULL){
printf("%d ", t->data);
preOrder(t->left);
preOrder(t->right);
}
}
// 中序遍历
void inOrder(Tree t){
if(t != NULL){
inOrder(t->left);
printf("%d ", t->data);
inOrder(t->right);
}
}
// 后序遍历
void postOrder(Tree t){
if(t != NULL){
postOrder(t->left);
postOrder(t->right);
printf("%d ", t->data);
}
}
// 插入节点
void insert(Tree t, int data){
if(t == NULL){
t = (Tree)malloc(sizeof(TreeNode));
t->data = data;
t->left = NULL;
t->right = NULL;
}else{
if(data < t->data){
insert(t->left, data);
}else{
insert(t->right, data);
}
}
}
// 查找节点
Tree search(Tree t, int data){
if(t == NULL){
return NULL;
}else{
if(data == t->data){
return t;
}else if(data < t->data){
return search(t->left, data);
}else{
return search(t->right, data);
}
}
}
// 删除节点
Tree delete(Tree t, int data){
Tree p = t, q = NULL;
while(p != NULL && p->data != data){
q = p;
if(data < p->data){
p = p->left;
}else{
p = p->right;
}
}
if(p == NULL){ // 没有找到要删除的节点
return t;
}
if(p->left == NULL){ // 要删除的节点没有左子树
if(q == NULL){ // 要删除的节点是根节点
t = p->right;
}else if(p == q->left){ // 要删除的节点是其父节点的左子节点
q->left = p->right;
}else{ // 要删除的节点是其父节点的右子节点
q->right = p->right;
}
free(p);
}else if(p->right == NULL){ // 要删除的节点没有右子树
if(q == NULL){ // 要删除的节点是根节点
t = p->left;
}else if(p == q->left){ // 要删除的节点是其父节点的左子节点
q->left = p->left;
}else{ // 要删除的节点是其父节点的右子节点
q->right = p->left;
}
free(p);
}else{ // 要删除的节点有左右子树
Tree s = p->left, r = p;
while(s->right != NULL){
r = s;
s = s->right;
}
p->data = s->data;
if(r == p){ // 要删除的节点的左子树没有右子树
r->left = s->left;
}else{ // 要删除的节点的左子树有右子树
r->right = s->left;
}
free(s);
}
return t;
}
int main(){
Tree t = NULL;
createTree(&t); // 创建二叉树
printf("先序遍历:");
preOrder(t); // 先序遍历
printf("\n中序遍历:");
inOrder(t); // 中序遍历
printf("\n后序遍历:");
postOrder(t); // 后序遍历
printf("\n");
int data;
printf("请输入要插入的节点值:");
scanf("%d", &data);
insert(t, data); // 插入节点
printf("中序遍历:");
inOrder(t); // 中序遍历
printf("\n请输入要查找的节点值:");
scanf("%d", &data);
Tree node = search(t, data); // 查找节点
if(node != NULL){
printf("找到了节点:%d\n", node->data);
}else{
printf("没有找到节点:%d\n", data);
}
printf("请输入要删除的节点值:");
scanf("%d", &data);
t = delete(t, data); // 删除节点
printf("中序遍历:");
inOrder(t); // 中序遍历
return 0;
}
```
以上代码实现了创建二叉树、先序遍历、中序遍历、后序遍历、插入节点、查找节点、删除节点等操作。