二叉树

1. 二叉树节点的创建(初始化)

* 
 * tree.c
 */
#include <stdlib.h>
#include "tree.h"

struct tree_node *tree_node_create(data_t data)
{
    struct tree_node *tmp = malloc(sizeof(*tmp));

    tmp->data = data;
    tmp->left_child = NULL;
    tmp->right_child = NULL;

    return tmp;
}

struct tree_node *tree_create(int h)
{
    struct tree_node *tmp;

    if (h < 0)
        return NULL;

    tmp = tree_node_create(h);//若是创建链表,则是先建一个头节点,再用循环来,创建
剩下的节点! 而这里是用递归!
    tmp->left_child = tree_create(h - 1);
    tmp->right_child = tree_create(h - 1);

    return tmp;
} 


2.创建二叉树

3.遍历二叉树

void tree_pre_traverse(struct tree_node *root, visit_t visit)
{
    if (NULL == root)
        return ;

    visit(root);
    tree_pre_traverse(root->left_child, visit);
    tree_pre_traverse(root->right_child, visit);
}

void tree_in_traverse(struct tree_node *root, visit_t visit)
{
    if (NULL == root)
        return ;

    tree_in_traverse(root->left_child, visit);
    visit(root);
    tree_in_traverse(root->right_child, visit);
}

void tree_post_traverse(struct tree_node *root, visit_t visit)
{
    if (NULL == root)
        return ;

    tree_post_traverse(root->left_child, visit);
    tree_post_traverse(root->right_child, visit);
    visit(root);
}


4.求二叉树的高度


5. 销毁二叉树

  创建二叉树,要从root节点开始,用“先根遍历”的方式创建二叉树

  若是销毁,则要最后一个销毁root节点,可用“后根遍历”的方式销毁二叉树

int tree_height(const struct tree_node *root)
{
    int lh = 0, rh = 0;

    if (NULL == root)
        return -1;
    lh = tree_height(root->left_child);
    rh = tree_height(root->right_child);


    return lh > rh ? (lh + 1) : (rh + 1);
}

void tree_destroy(struct tree_node *root)
{
    if (NULL == root)
        return ;

    tree_destroy(root->left_child);
    tree_destroy(root->right_child);
    free(root);
}

-------------------------------------------------------------------

/*
 * tree.h
 */

#ifndef __TREE_H__
#define __TREE_H__

typedef int data_t;

struct tree_node {
    data_t data;

    struct tree_node *left_child, *right_child;
};

typedef void (*visit_t)(struct tree_node *); 

struct tree_node *tree_node_create(data_t data);
struct tree_node *tree_create(int h); 
void tree_pre_traverse(struct tree_node *root, visit_t visit);
void tree_in_traverse(struct tree_node *root, visit_t visit);
void tree_post_traverse(struct tree_node *root, visit_t visit);
int tree_height(const struct tree_node *root);

void tree_destroy(struct tree_node *root);
#endif

------------------------------------------------测试文件:

#include <stdio.h>
#include "tree.h"

void visit(struct tree_node *node)
{
    printf("%d ", node->data);
}

int main()
{
    struct tree_node *root;

    root = tree_create(3);

    tree_pre_traverse(root, visit);

    printf("\n");
    printf("%d  \n", tree_height(root));

    tree_destroy(root);
    tree_pre_traverse(root, visit);

    return 0;
}



--------------------------------------------------------------

/*tree.h*/
typedef int data_t;

struct tree_node {
   data_t data;
   struct tree_node *left_child, *right_child;
};

struct tree_node create_tree_node(data_t data);

struct tree_node tree_init(int h); 

void traverse_pre_tree(struct tree_node *root)

int height(struct tree_node *root)




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值