zoukankan      html  css  js  c++  java
  • C语言之二叉树

    规定:根节点的值大于左节点但小于右节点的值,所以二叉树的值插入是唯一的,最后形成的树只跟根节点有关

    定义节点:

    struct tree_node {
          TypeElem  elem;

          struct tree_node *fa;
          struct tree_node *left;
          struct tree_node *right;
    };

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 typedef int TypeElem;
      5 
      6 struct tree_node {
      7     TypeElem  elem;
      8     struct tree_node *fa;
      9     struct tree_node *left;
     10     struct tree_node *right;
     11 };
     12 
     13 struct tree_node *root_ptr;    //指向根节点的指针
     14 
     15 #define IS_ROOT_NODE(ptree_fa, ptree, x)  do{ if(ptree_fa) {   
     16                                                     if (ptree == ptree_fa->left)   
     17                                                          ptree_fa->left = x;    
     18                                                     else if (ptree == ptree_fa->right)   
     19                                                          ptree_fa->right = x;   
     20                                           }else                                 
     21                                               root_ptr = x; }while (0)       //如果删除的是根节点root_ptr就变了
     22 
     23 
     24 /* 在父节点下插入子节点(有可能是孙子节点了) */
     25 struct tree_node *Insert(TypeElem  elem, struct tree_node *T_fa, struct tree_node *T)
     26 {
     27     if (T == NULL) {
     28         T = (struct tree_node *)malloc(sizeof(struct tree_node));
     29         if (!T) {
     30             printf("malloc error
    ");
     31             return NULL;
     32         }
     33         T->fa = T_fa;
     34         T->elem = elem;
     35         T->left = T->right = NULL;
     36     }
     37     else if (elem < T->elem)
     38         T->left = Insert(elem, T, T->left);
     39     else if (elem > T->elem)
     40         T->right = Insert(elem, T, T->right);
     41 
     42     return T;
     43 }
     44 
     45 struct tree_node *find_val(struct tree_node *rootp, TypeElem  elem)
     46 {
     47     if (!rootp) {
     48         printf("don't find
    ");
     49         return NULL;
     50     }
     51     //遍历:前序、中序、后序
     52     if (rootp->elem == elem)
     53         return rootp;
     54     else if (rootp->elem > elem) {
     55         return find_val(rootp->left, elem);   //递归
     56     }
     57     else if (rootp->elem < elem) {
     58         return find_val(rootp->right, elem);  //递归
     59     }
     60     return NULL;
     61 }
     62 
     63 struct tree_node *find_min_val(struct tree_node *rootp)
     64 {
     65     while (rootp->left) {
     66         rootp = rootp->left;
     67     }
     68     return rootp;
     69 }
     70 
     71 struct tree_node *find_max_val(struct tree_node *rootp)
     72 {
     73     while (rootp->right) {
     74         rootp = rootp->right;
     75     }
     76     return rootp;
     77 }
     78 
     79 int delete_tree(TypeElem  elem, int isfree)
     80 {
     81     struct tree_node *ptree = find_val(root_ptr, elem);
     82     struct tree_node *ptree_fa = ptree->fa;
     83     struct tree_node *min_tree;
     84 
     85     if (!ptree)
     86         return -1;
     87     if (!(ptree->left) && !(ptree->right)) {
     88          IS_ROOT_NODE(ptree_fa, ptree, NULL);
     89     }
     90     else if (!(ptree->left) && ptree->right) {
     91          IS_ROOT_NODE(ptree_fa, ptree, ptree->right);
     92          ptree->right->fa = ptree_fa;
     93     }
     94     else if (ptree->left && !(ptree->right)) {
     95         IS_ROOT_NODE(ptree_fa, ptree, ptree->left);
     96         ptree->left->fa = ptree_fa;
     97     }
     98     else if (ptree->left && ptree->right) {
     99         min_tree = find_min_val(ptree->right);
    100         delete_tree(min_tree->elem, 0);   //递归
    101         IS_ROOT_NODE(ptree_fa, ptree, min_tree);
    102         min_tree->left = ptree->left;
    103         min_tree->right = ptree->right;
    104         min_tree->fa = ptree->fa;
    105     }
    106     if (isfree)
    107         free(ptree);
    108     return 0;
    109 }
    110 
    111 int main()
    112 {
    113     int i;
    114     root_ptr = Insert(6, NULL, root_ptr);    //得到指向根节点的指针 
    115 TypeElem a[10] = { 2,8,7,9,0,3,4,1,5 }; //依次插入9个节点 116 for (i = 0; i < 9; i++) 117 Insert(a[i], root_ptr->fa, root_ptr); 118 if (!delete_tree(6, 1)) 119 printf("delete_tree ok "); 120 if (root_ptr) { 121 if (find_val(root_ptr, 9)) 122 printf("find node "); 123 } 124
    125 return 0; 126 }
     

    形成的树结构:

    如果删除根节点6,依然能找到节点9

  • 相关阅读:
    java基础(二):补充
    java基础(二):变量和数据类型
    C基础系列(一)
    java基础(一)
    循环小数(Repeating Decimals)
    DNA序列(DNA Consensus String)
    sqlserver~创建函数
    docker简介和安装
    JMeter(6)、实现Java请求
    JMeter(5)、测试数据库
  • 原文地址:https://www.cnblogs.com/zhu-g5may/p/10502156.html
Copyright © 2011-2022 走看看