硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4811|回复: 0
收起左侧

二叉树之链表操作

[复制链接]

8

主题

11

回帖

8

积分

新手上路

积分
8
发表于 2016-3-27 14:36:57 | 显示全部楼层 |阅读模式
最近学习下了二叉树的基本操作的coding,分享下代码,使用VS编译,下面的程序运行结果:
VE5ZOOAG(GJ09K5X2Z7VOJL.png

  1. /*
  2. *********************************************************************************************************
  3. *
  4. *    模块名称 : 二叉树
  5. *    文件名称 : BiTree.c
  6. *    版    本 : V1.0
  7. *    说    明 : 使用动态分配的链式结构实现的二叉树和基本操作
  8. *   改    进 : 增加对树动态排序;增加destroy tree 的操作;增加求树的深度和各个层数的节点数;每个节点添加父节点,方便求父节点,需要在插入函数里修改一下
  9. *    修改记录 :
  10. *        版本号  日期        作者     说明
  11. *        V1.0    2016-03-27 yao  测试
  12. *
  13. *    Copyright (C), 2016,SCUTer
  14. *
  15. *********************************************************************************************************
  16. */
  17. //                             _ooOoo_  
  18. //                            o8888888o  
  19. //                            88" . "88  
  20. //                            (| -_- |)  
  21. //                             O\ = /O  
  22. //                         ____/`---'\____  
  23. //                       .   ' \\| |// `.  
  24. //                        / \\||| : |||// \  
  25. //                      / _||||| -:- |||||- \  
  26. //                        | | \\\ - /// | |  
  27. //                      | \_| ''\---/'' | |  
  28. //                       \ .-\__ `-` ___/-. /  
  29. //                    ___`. .' /--.--\ `. . __  
  30. //                 ."" '< `.___\_<|>_/___.' >'"".  
  31. //               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
  32. //                  \ \ `-. \_ __\ /__ _/ .-` / /  
  33. //          ======`-.____`-.___\_____/___.-`____.-'======  
  34. //                             `=---='  
  35. //          .............................................  
  36. //
  37. #include"stdio.h"
  38. #include"malloc.h"
  39. #define Tree_Type int//定义数的具体类型
  40. //定义树结点的结构体
  41. typedef struct Tree_Node{
  42.     Tree_Type value;
  43.     struct Tree_Node *left;
  44.     struct Tree_Node *right;
  45. }TreeNode_TypeDef;
  46. //定义树的结构体,通过结构体操作数
  47. typedef struct Bi_tree_Struct{
  48.     TreeNode_TypeDef root;
  49.     unsigned char(*insert)(Tree_Type, struct Bi_tree_Struct*);
  50.     TreeNode_TypeDef*(*find)(Tree_Type, struct Bi_tree_Struct*);
  51.     void(*pre_order_traverse)(struct Bi_tree_Struct, void(*callback)(Tree_Type value));
  52. }Bi_tree;
  53. //-------------------function declare----------------------
  54. void init_bitree(Bi_tree*Tree, Tree_Type root_value);
  55. void print_tree_node(Tree_Type value)
  56. {
  57.     printf("%d ",value);
  58. }
  59. int main(void)
  60. {
  61.     //树根节点指针
  62.      Bi_tree Tree1;
  63.      TreeNode_TypeDef*temp;
  64.     int i = 0xffffffff;
  65.     init_bitree(&Tree1, 1);
  66.     Tree1.pre_order_traverse(Tree1, print_tree_node);
  67.     printf("\r\n");
  68.     Tree1.insert(-1, &Tree1);
  69.     if (Tree1.root.left == NULL)
  70.     {
  71.         if (Tree1.root.right == NULL)
  72.             printf("insert error\r\n");
  73.     }
  74.     Tree1.pre_order_traverse(Tree1, print_tree_node);
  75.     printf("\r\n");
  76.     printf("insert error code:%d\r\n", Tree1.insert(-1, &Tree1));
  77.     Tree1.pre_order_traverse(Tree1, print_tree_node);
  78.     printf("\r\n");
  79.     Tree1.insert(5, &Tree1);
  80.     Tree1.insert(3, &Tree1);
  81.     Tree1.insert(2, &Tree1);
  82.     Tree1.pre_order_traverse(Tree1, print_tree_node);
  83.     temp = Tree1.find(1, &Tree1);
  84.     printf("find:%d\r\n", temp->value);
  85.     while (i--);
  86.     return 0;
  87. }
  88. //insert
  89. //value:要插入的节点数据,
  90. //选择插入的树
  91. //return:0 sucess;
  92. //        1:the data already exist
  93. //        2:malloc data unsucess
  94. static unsigned char insert(Tree_Type value, Bi_tree*Tree)
  95. {
  96.     TreeNode_TypeDef*current;
  97.     TreeNode_TypeDef*temp;
  98.     TreeNode_TypeDef**link;
  99.     //从根节点开始
  100.     temp = &Tree->root;
  101.     link = &temp;
  102.     //查找到合适的子树
  103.     while ((current = *link) != NULL)
  104.     {
  105.         //根据大小选择左子树和右子树(确认没有出现重复的值)
  106.         if (value < current->value)
  107.         {
  108.             link = &current->left;
  109.         }
  110.             
  111.         else {
  112.             if (value != current->value)
  113.                 link = &current->right;
  114.             else
  115.                 return 1;
  116.         }
  117.     }
  118.     //动态分配内存,插入新的节点
  119.     current = malloc(sizeof(TreeNode_TypeDef));
  120.     if (current == NULL)
  121.         return 2;
  122.     else
  123.     {
  124.         current->value = value;
  125.         current->left = NULL;
  126.         current->right = NULL;
  127.         *link = current;
  128.     }
  129.     return 0;
  130. }
  131. //find
  132. //value:要查找的节点数据,
  133. //选择查找的树
  134. //return:NULL don't find the node
  135. static TreeNode_TypeDef*find(Tree_Type value, Bi_tree*Tree)
  136. {
  137.     TreeNode_TypeDef*current;
  138.     //从跟节点开始查找
  139.     current = &Tree->root;
  140.     while (current != NULL && current->value != value)
  141.     {
  142.     //选择合适的子树
  143.         //根据大小选择左子树和右子树(确认没有出现重复的值)
  144.         if (value < current->value)
  145.             current = current->left;
  146.         else {
  147.                 current = current->right;
  148.         }
  149.     }
  150.     return current;
  151. }
  152. //前序遍历,这个函数帮助我们查看所有节点的信息
  153. static void do_pre_order_traverse(TreeNode_TypeDef*current, void(*callback)(Tree_Type value))
  154. {
  155.     if (current != NULL)
  156.     {
  157.         callback(current->value);
  158.         do_pre_order_traverse(current->left, callback);
  159.         do_pre_order_traverse(current->right, callback);
  160.     }
  161. }
  162. static void pre_order_traverse(Bi_tree Tree, void(*callback)(Tree_Type value))
  163. {
  164.     do_pre_order_traverse(&Tree.root, callback);
  165. }
  166. //初始化二叉树
  167. //根节点的值
  168. void init_bitree(Bi_tree*Tree, Tree_Type root_value)
  169. {
  170.     Tree->root.value = root_value;
  171.     Tree->root.left = NULL;
  172.     Tree->root.right = NULL;
  173.     Tree->insert = insert;
  174.     Tree->find = find;
  175.     Tree->pre_order_traverse = pre_order_traverse;
  176. }
复制代码
知行合一
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 07:04 , Processed in 0.146516 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表