二叉排序树

1、定义二叉树数据域、二叉树结点

/**
 * 二叉树节点数据
*/
typedef  struct treenodedata
{
    int sort;

    char* name;

} TreeNodeData;


/***
 * 二叉树节点定义
*/
typedef struct binarytree
{
    /**
     * 结点数据域
    */
    TreeNodeData* data;

     /**左子树*/
    struct binarytree* leftChild;

     /**左子树*/
    struct binarytree*  rightChild;

} TreeNode;

2、二叉排序树操作函数声明

/**
 * 创建二叉树
*/
TreeNode*  create_tree_node(TreeNodeData* data);

/**
 * 添加二叉排序树
*/
void  insert_tree_node(TreeNode** tree ,TreeNodeData* data);

/**
 * 前序遍历
*/
void   per_order(TreeNode** tree );


/**
 * 中序序遍历
*/
void   in_order(TreeNode** tree );



/**
 * 后序遍历
*/
void   post_order(TreeNode** tree );

/**
 * 销毁
*/
void   destroy_binary_tree(TreeNode* tree);

3、二叉排序树操作函数定义

/**
 * 创建二叉树结点
 */
TreeNode* create_tree_node(TreeNodeData *data)
{
    TreeNode* node = malloc(sizeof(TreeNode*));
    if (node == NULL)
    {
        perror("create_tree_node结点分配内存空间异常\n");
        return NULL;
    }
    node->data = malloc(sizeof(TreeNodeData *));
    if (node->data == NULL)
    {
        perror("节点数数据域分配内存空间失败\n");
        free(node);
        return NULL;
    }
    node->data->sort = data->sort;
    node->data->name = data->name;
    node->leftChild = NULL;
    node->rightChild = NULL;
    printf("创建二叉树成功\n");
    return node;
}

/**
 * 添加二叉排序树
 * TreeNode **tree 为了该改变函数外部指针变量的值,这里需要使用二级指针传参
 */
void insert_tree_node(TreeNode **tree, TreeNodeData *data)
{
    TreeNode* curNode = *tree;
    if (curNode == NULL)
    {
        TreeNode* node = create_tree_node(data);
        if(node==NULL)
        {
            return;
        }
        *tree = node;
        return;
    }
    /// 插入节点数据域小于父节点数据域,递归左子树
    if (curNode->data->sort > data->sort)
       insert_tree_node(&((*tree)->leftChild),data);
    else
       insert_tree_node(&((*tree)->rightChild),data);     
}

/**
 * 前序遍历
 */
void per_order(TreeNode **tree)
{
   TreeNode* curNode = *tree;
   if(curNode==NULL)
   {
     return;
   }
   printf("前序遍历sort=%d,name=%s\n",curNode->data->sort,curNode->data->name);
   per_order(&(curNode->leftChild));
   per_order(&(curNode->rightChild));
}



/**
 * 中序序遍历
*/
void   in_order(TreeNode** tree )
{
   TreeNode* curNode = *tree;
   if(curNode==NULL)
   {
     return;
   }
   in_order(&(curNode->leftChild));
   printf("中序序遍历sort=%d,name=%s\n",curNode->data->sort,curNode->data->name);
   in_order(&(curNode->rightChild));

}



/**
 * 后序遍历
*/
void   post_order(TreeNode** tree )
{
   TreeNode* curNode = *tree;
   if(curNode==NULL)
   {
     return;
   }
   post_order(&(curNode->leftChild));
   post_order(&(curNode->rightChild));
   printf("后序遍历sort=%d,name=%s\n",curNode->data->sort,curNode->data->name);
}


/**
 * 销毁
*/
void   destroy_binary_tree(TreeNode* tree)
{
   if(tree==NULL)
   {
     return;
   }
   destroy_binary_tree(tree->leftChild);
   destroy_binary_tree(tree->rightChild);
   tree = NULL;
   free(tree);    
   printf("销毁二叉树完毕\n");
}

 4、测试

void  test_binary_tree()
{
  TreeNodeData st_arr[7] ={ {10,"GuanYu"},{8,"ZhangFei"},{12,"ZHaoYun"},{7,"WeiYan"}, {9,"ZheGeLiang"},{11,"MaChao"},{13,"LiuBei"}} ;
  int  i = 0;
  TreeNode* tree = NULL;
  printf("111-tree=%p\n",tree);
  for(;i<7;i++)
  {
    TreeNodeData*  data = &st_arr[i];
    insert_tree_node(&tree,data);
  }
  printf("222-tree=%p\n",tree);
  printf("前序遍历------------------------------\n");
  per_order(&tree);
  printf("中序遍历------------------------------\n");
  in_order(&tree);
  printf("后序遍历------------------------------\n");
  post_order(&tree);
    printf("销毁二叉树------------------------------\n");
  destroy_binary_tree(tree);
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值