前言
- 树是一种一对多的数据结构,是由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;
}