ds_04_tree

前言

  • 是一种一对多的数据结构,是由n(n>=0)个有限节点组成的1个有层次关系的集合
  • 树的每个元素称为节点(node),每个节点有0个/多个子节点
  • 没有父节点的节点称为根节点;每个非根节点有且只有1个父节点
  • 节点左侧的部分就是该节点的左子树,右子树同理
  • 节点拥有的子树数量称为几点的度:

                   

  • 节点层次:根为第一层,以此类推
  • 每个节点最多含有2个子树的树,称为二叉树
  • 有序二叉树:左边节点的值总是小于右边
  • 有序二叉树的遍历:
  • 前序遍历:依次访问根节点、左子树、右子树(根在前)
  • 中序遍历:依次访问左子树、根节点、右子树(根在中)
  • 后序遍历:依次访问左子树、右子树、根节点(根在中)

       

1 二叉树的定义:复习

//二叉树的定义
//描述节点属性的结构体
struct node{
    int data;//节点数据
    struct node *left;//保存左子树的首地址
    struct node *right;//保存右子树的首地址
};

//描述整棵树的结构体
struct tree{
    struct node *root;//保存根节点的首地址
    int cnt;//保存有效节点的个数
};

2 树的头文件 tree.h

//tree.h 树的定义
#ifndef __TREE_H_
#define __TREE_H_
#include<stdio.h>
#include<stdlib.h>
//定义节点
typedef struct node{
    int data;//数据
    struct node* left;//指向左子树
    struct node* right;//指向右子树
}node_t;
//定义树
typedef struct tree{
    struct node* root;//指向根节点
    int cnt;//记录节点个数
}tree_t;
//树的操作
//树的初始化
void tree_init(tree_t* t);
//向树中插入新节点
void tree_insert(tree_t* t,int data);

#endif //__TREE_H_

3 树的实现 tree.c

//tree.c 树的实现
#include"tree.h"

//树的初始化
//tree_t tree;  tree.root  tree.cnt
//tree_init(&tree);
void tree_init(tree_t* t){
    t->root = NULL;
    t->cnt = 0;
}
//向树中插入新节点
void tree_insert(tree_t* t,int data){
    //创建新节点
    node_t* new = malloc(sizeof(node_t));
    new->left = NULL;
    new->right = NULL;
    new->data = data;
    
    //如果树还是空的,没有节点,新节点作为树根
    if(t->root == NULL){
        t->root = new;
        t->cnt++;
        return ;
    }
    //如果树不是空的,找位置,插入新节点
    node_t* p1,*p2;//辅助找插入位置
    p1 = p2 = t->root;
    while(p2 != NULL){
        p1 = p2;
        if(p2->data > data){
            //p2向左
            p2 = p2->left;
        }else if(p2->data < data){
            p2 = p2->right;
        }else{
            printf("节点存在");
            free(new);
            return ;
        }
    }//当循环结束时,p2指向NULL,p1指向的节点,为新节点应该插入的位置
    //判断新节点应该插在p1指向节点的左侧还是右侧
    if(p1->data > data){
        p1->left = new;
    }else{
        p1->right = new;
    }

    //计数加一
    t->cnt++;
}

4 树的测试 main.c

//main.c 树的测试
#include"tree.h"

int main(void){
    //定义树
    tree_t tree;
    //初始化
    tree_init(&tree);
    //插入节点
    tree_insert(&tree,60);
    tree_insert(&tree,80);
    tree_insert(&tree,40);
    tree_insert(&tree,20);
    tree_insert(&tree,90);
    //遍历
    tree_miter(tree.root);
    printf("\n");
    tree_fiter(tree.root);
    printf("\n");
    tree_liter(tree.root);
    printf("\n");

    //删除节点
    tree_del(&tree,40);
    tree_miter(tree.root);
    printf("\n");
    tree_fiter(tree.root);
    printf("\n");
    tree_liter(tree.root);
    printf("\n");
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值