随笔小屋 Logo
首页
瞬间
反馈
随笔小屋 Logo
首页 瞬间 反馈
  1. 首页
  2. 数据结构与算法
  3. 二叉树

二叉树

  • 数据结构与算法
  • 发布于 2025-09-04
  • 180 次阅读
flor
flor
#ifndef __TREE_H__
#define __TREE_H__
typedef struct node{
    int data;
    struct node* left;
    struct node* right; 
}node_t;

typedef struct {
    node_t* root;
    int number;
}tree_t;

//初始化
void tree_init(tree_t* t);
//释放
void tree_deinit(node_t* t);
//插入
void tree_insert(tree_t* t,int data);
//删除节点
void tree_del(tree_t* t,int data);
//前序遍历
void tree_first(node_t* t);
//中序遍历
void tree_mid(node_t* t);
//后续遍历
void tree_last(node_t* t);
#endif //__TREE_H__
#include<stdio.h>
#include<stdlib.h>
#include"tree.h"
void tree_init(tree_t *t){
    t->root = NULL;
    t->number = 0;
}

void tree_deinit(node_t* t){
    if(t==NULL){
        return;
    }
    tree_deinit(t->left);
    tree_deinit(t->right);
    free(t);
}

void tree_insert(tree_t *t, int data){
    node_t* new = malloc(sizeof(node_t));
    new->data = data;
    new->left = NULL;
    new->right = NULL;
    if(t->root == NULL){
        t->root = new;
        t->number++;
        return;
    }
    node_t *p1 ,*p2;
    p1 = p2 = t->root;
    while(p2 != NULL){
        p1 = p2;
        if(p2->data > data){
            p2 = p2->left;
        }else{
            p2 = p2->right;
        }
    }
    if(data > p1->data){
        p1->right = new;
    }else{
        p1->left = new;
    }
    t->number++;
}

void tree_del(tree_t *t, int data){
    node_t *p1 ,*p2;
    p1 = p2 = t->root;
    while(p2 != NULL && p2->data != data){
        p1 = p2;
        if(p2->data < data){
            p2 = p2->right;   
        }else if(p2->data > data){
            p2 = p2->left;
        }
        
    }
    if(p2 == NULL){
        return;
    }
    node_t* left = p2->left;
    node_t* right = p2->right;
    
    if(left != NULL && right == NULL){
        if(p1->data > p2->data){
            p1->left = left;
        }else{
            p1->right = left;
        }
    }
    else if(right != NULL && left == NULL){
        if(p1->data < p2->data){
            p1->right = right;
        }else{
            p1->left = right;
        }
    }
    else if(right == NULL && left == NULL){
        if(p1->data < p2->data){
            p1->right = NULL;
        }else{
            p1->left = NULL;
        }
    }
    else if(right != NULL && left != NULL){
        node_t *p3 ,*p4;
        p3 = p4 = right;
        while(p4 != NULL){
            p3 = p4;
            p4 = p4->left;
        }
        p3->left = left;
        if(p1->data > p2->data){
            p1->left = right;
        }else {
            p1->right = right;
        }
    }
    free(p2);
    p2=NULL;
    t->number--;
}

void tree_first(node_t *t){
    if(t==NULL){
        return;
    }
    printf("%d ",t->data);
    tree_first(t->left);
    tree_first(t->right);
    
}

void tree_mid(node_t *t){
    if(t==NULL){
        return;
    }
    tree_mid(t->left);
    printf("%d ",t->data);
    tree_mid(t->right);
    
}

void tree_last(node_t *t){
    if(t==NULL){
        return;
    }
    tree_last(t->left);
    tree_last(t->right); 
    printf("%d ",t->data);
}
#include<stdio.h>
#include"tree.h"
int main(void){
    tree_t tree;
    tree_init(&tree);
    
    tree_insert(&tree, 20);
    tree_insert(&tree, 50);
    tree_insert(&tree, 40);
    tree_insert(&tree, 30);

    tree_del(&tree,30);
    tree_first(tree.root);
    printf("\n");
    tree_mid(tree.root);
    printf("\n");
    tree_last(tree.root);
    printf("\n");
    return 0;
}

湘ICP备2025147565号-1
gongan beian 湘公网安备43102602000213号
CPU --% | 内存 0.00G/0.00G (0%) | 网络 无活动网卡
服务器资源占用 更新时间 --:--:--