Day19、树的完整版代码

来源:互联网 发布:php array判断 编辑:程序博客网 时间:2024/04/19 18:26

编写源文件:02tree.c

/*

    二叉树演示

*/

#include <stdlib.h>

#include "02tree.h"

//初始化函数

void tree_init(tree *p_tree) {

   p_tree->p_node = NULL;

}

//清理函数

void tree_deinit(tree *p_tree) {

   if (!(p_tree->p_node)) {

       return ;

    }

   tree_deinit(&(p_tree->p_node->left));

   tree_deinit(&(p_tree->p_node->right));

   free(p_tree->p_node);

   p_tree->p_node = NULL;

}

//在有序二叉树里查找某个数字所在的位置

tree *tree_search_in_order(const tree*p_tree, int num) {

   if (!(p_tree->p_node)) {

       return (tree *)p_tree;

    }

   if (p_tree->p_node->num == num) {

       return (tree *)p_tree;

    }

   else if (p_tree->p_node->num > num) {

       return tree_search_in_order(&(p_tree->p_node->left), num);

    }

   else {

       return tree_search_in_order(&(p_tree->p_node->right), num);

    }

}

//在有序二叉树里插入新数字

void tree_insert_in_order(tree *p_tree, intnum) {

   tree *p_tr = tree_search_in_order(p_tree, num);

   if (p_tr->p_node) {

       return ;

    }

   node *p_tmp = (node *)malloc(sizeof(node));

   if (!p_tmp) {

       return ;

    }

    p_tmp->num= num;

   p_tmp->left.p_node = NULL;

   p_tmp->right.p_node = NULL;

   p_tr->p_node = p_tmp;

}

//中序遍历函数

void tree_miter(tree *p_tree, void(*p_func)(int)) {

   if (!(p_tree->p_node)) {

       return ;

    }

   tree_miter(&(p_tree->p_node->left), p_func);

   p_func(p_tree->p_node->num);

   tree_miter(&(p_tree->p_node->right), p_func);

}

//前序遍历函数

void tree_fiter(tree *p_tree, void(*p_func)(int)) {

   if (!(p_tree->p_node)) {

       return ;

    }

   p_func(p_tree->p_node->num);

   tree_fiter(&(p_tree->p_node->left), p_func);

   tree_fiter(&(p_tree->p_node->right), p_func);

}

//后序遍历函数

void tree_liter(tree *p_tree, void(*p_func)(int)) {

   if (!(p_tree->p_node)) {

       return ;

    }

   tree_liter(&(p_tree->p_node->left), p_func);

   tree_liter(&(p_tree->p_node->right), p_func);

   p_func(p_tree->p_node->num);

}

//从有序二叉树里删除一个数字的函数

void tree_remove(tree *p_tree, int num) {

   node *p_remove = NULL, *p_left = NULL, *p_right = NULL;

   tree *p_tmp = tree_search_in_order(p_tree, num);

   if (!(p_tmp->p_node)) {

       return ;

    }

   p_remove = p_tmp->p_node;

   p_left = p_remove->left.p_node;

   p_right = p_remove->right.p_node;

   if (!p_left) {

       p_tmp->p_node = p_right;

    }

   else if (!p_right) {

       p_tmp->p_node = p_left;

    }

   else {

       tree *p_tmp1 = tree_search_in_order(&(p_remove->left),p_right->num);

       p_tmp1->p_node = p_right;

       p_tmp->p_node = p_left;

    }

   free(p_remove);

   p_remove = NULL;

}

编写头文件:02tree.h

#ifndef   __02TREE_H__

#define   __02TREE_H__

struct node;

typedef struct {

   struct node *p_node;

} tree;

typedef struct node {

   int num;

   tree left;

   tree right;

} node;

//初始化函数

void tree_init(tree *);

//清理函数

void tree_deinit(tree *);

//在有序二叉树里查找某个数字所在的位置

tree *tree_search_in_order(const tree *,int );

//在有序二叉树里插入新数字

void tree_insert_in_order(tree *, int );

//中序遍历函数

void tree_miter(tree *, void (*)(int));

//前序遍历函数

void tree_fiter(tree *, void (*)(int));

//后序遍历函数

void tree_liter(tree *, void (*)(int));

//从有序二叉树里删除数字的函数

void tree_remove(tree *, int);

#endif        //__02TREE_H__

编写主函数02main.c

#include <stdio.h>

#include "02tree.h"

void print_cb(int num) {

   printf("%d ", num);

}

int main() {

   tree tr = {0};

   tree_init(&tr);

   tree_insert_in_order(&tr, 50);

   tree_insert_in_order(&tr, 25);

   tree_insert_in_order(&tr, 80);

   tree_insert_in_order(&tr, 13);

   tree_insert_in_order(&tr, 37);

   tree_insert_in_order(&tr, 61);

   tree_insert_in_order(&tr, 93);

   tree_insert_in_order(&tr, 7);

    tree_remove(&tr, 25);

   tree_miter(&tr, print_cb);

   printf("\n");

   tree_deinit(&tr);

   return 0;

}

 

1 0
原创粉丝点击