数据结构之二叉树

二叉树

二叉树是一种常用的数据结构。

1、什么是二叉树?
1.1 什么是树型结构?

树形结构是一层次的嵌套结构。 一个树形结构的外层和内层有相似的结构, 所以这种结构多可以递归的表示。经典数据结构中的各种树状图是一种典型的树形结构:一颗树可以简单的表示为根, 左子树, 右子树。 左子树和右子树又有自己的子树。

1.2 什么是二叉树?

二叉树是树型结构的最简化模型,每个节点最多有两个子节点。

2、二叉树有什么用?

二叉树可以做搜索,它的搜索速度比较快,logn级别,当然也有其他的用处,比如排序。  

3、二叉树的结构

二叉树的节点结构体包括一个数据和两个指针,一个指针指向左节点,一个指针指向右节点。二叉树的结构体包含一个储存大小的整数类型和一个指针,指针指向树的根节点。

4、有序二叉树的实现

4.1 什么是有序二叉树?

对于树中任意节点,若其左子树非空,则左子树中所有节点的值,都小于或等于该节点的值,若其右子树非空,则右子树中所有节点的值都大于或等于该节点的值。(左小右大)则该树称为有序二叉树,也叫二叉搜索树。

 

4.2 基础的操作

1、初始化

2、销毁

3、插入

4、擦除一个指定数据

5、擦除所有指定数据

6、清空树

7、判断指定数据是否存在

8、遍历树

9、获取树的大小

4.3 笔记

这是我在观看视频的时候写的笔记

一、二叉树

1、树型结构的最简化模型,每个节点最多有两个子节点。

2、有父节点没有子节点的点,称为叶节点

    有父节点有子节点,称为支节点

   无父节点的,称为根节点

 

3、二叉树的特性:

单根性:除了根节点以外的每个节点都有父节点,整棵树有且仅有一个根节点。

递归性:以二叉树的任意一个节点为根,都可以构成一个二叉树。

 

4、遍历序

1)前序遍历:D-L-R先访问数据,在访问左子树,再访问右子树。

2)中序遍历:L-D-R

3)后序遍历: L-R-D

 

5、形式表示:根节点、枝节点、叶节点、父节点、子节点、左子节点、

右子节点、高度(深度)、宽度(广度)。

 

6、满二叉树

除了叶节点,每个节点都有两个子节点。

 

7、完全二叉树:

并不满,除了最下一层,其他层都达到满的状态。同时,最下层的节点

集中在左侧。

 

8、存储结构

1)顺序存储

使用数组存,从上到下,从左到右,依次存放。

非完全树要将虚结点补全成完全树,会浪费空间

 

2)链式存储:二叉链表、三叉链表

拓扑结构符合。

二叉链表:每个节点有两个指针,分别指向左子节点,右子节点,还有一个

数据

三叉链表:每个节点有三个指针,分别指向左子节点,右子节点,以及父节

点,外加一个数据。

 

9、有序二叉树(二叉搜索树)

1)对于树中任意节点,若其左子树非空,则左子树中所有节点的值,都小于

或等于该节点的值,若其右子树非空,则右子树中所有节点的值都大于或等

于该节点的值。(左小右大)则该树称为有序二叉树。

 

有序二叉树 +中序遍历 得到升序序列,排序性能好

搜索:o(logN)

树搜索快,构建慢。

4.4 基于链表的有序二叉树的c语言实现

头文件

/*create a tree*/
#ifndef _BT_H
#define _BT_H
#include <sys/types.h>
#include <stdbool.h>
/*node*/
typedef struct BsTreeNode{
	int data;
	struct BsTreeNode* left;
	struct BsTreeNode* right;
	
}BSTREE_NODE;

typedef struct BsTree{
	BSTREE_NODE* root;
	size_t size;
}BSTREE;

/*init to a empty tree*/
void bstree_init(BSTREE* bstree);

/*free rest node,and init*/
void bstree_deinit(BSTREE* bstree);

/*insert*/
void bstree_insert(BSTREE* bstree,int data);

/*delete*/
bool bstree_erase(BSTREE* bstree,int data);

/*delete all the right data*/
void bstree_remove(BSTREE* bstree,int data);

/*clear*/
void bstree_clear(BSTREE* bstree);

/*updata*/
void bstree_updata(BSTREE* bstree,int old, int _new);

/*there are ?*/
bool bstree_exist(BSTREE* bstree,int data);

/**/
void bstree_travel(BSTREE* bstree);

/*how many */
size_t bstree_size(BSTREE* bstree);

/*height*/
size_t bstree_height(BSTREE* bstree);
#endif/*_BT_H*/

 

C文件

#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include "bt.h"
/*internal interface*/

/*create a node*/
static BSTREE_NODE* create_node(int data){
	BSTREE_NODE* node=malloc(sizeof(BSTREE_NODE));
	node->data=data;
	node->left=NULL;
	node->right=NULL;
	return node;
}
/*delete node*/
static void destroy_node(BSTREE_NODE* node){
	free(node);
};

/*insert node to a tree base on root*/
static void insert(BSTREE_NODE* node,BSTREE_NODE** root){
	if(!*root)
		*root=node;
	else if(node)
		if(node->data<(*root)->data)
			insert(node,&(*root)->left);
		else
        	insert(node,&(*root)->right);

};

/*return the tree based on root ,...*/
static BSTREE_NODE** find(int data,BSTREE_NODE** root){
	if(!*root)
		return root; /*find failed*/
	if(data<(*root)->data)
		return find(data,&(*root)->left);
	if(data>(*root)->data)
		return find(data,&(*root)->right);
	return root;/*find success*/
}

/*clear all*/
static void clear(BSTREE_NODE** root){
	if(*root){
		clear(&(*root)->left);
		clear(&(*root)->right);
		destroy_node(*root);
		*root=NULL;
	}
}

/*travel */
static void travel(BSTREE_NODE* root){
	if(root)
	{
		travel(root->left);
		printf("%d ",root->data);
		travel(root->right);
//		printf("%d ",);
	}
}

/*return height*/
static size_t height(BSTREE_NODE* root){
	if(root){
		size_t lh=height(root->left);
		size_t rh=height(root->right);
		return (lh>rh?lh:rh)+1;
	}
	return 0;
}
/*external interface */

/*init to a empty tree*/
void bstree_init(BSTREE* bstree){
	bstree->root=NULL;
	bstree->size=0;
}

/*free rest node,and init*/
void bstree_deinit(BSTREE* bstree){
	clear(&bstree->root);
	bstree->size=0;
}

/*insert*/
void bstree_insert(BSTREE* bstree,int data){
	insert(create_node(data),&bstree->root);
	++bstree->size;
};

/*delete*/
bool bstree_erase(BSTREE* bstree,int data){
	BSTREE_NODE** node=find(data,&bstree->root);
	if(*node){
		insert((*node)->left,&(*node)->right);
		BSTREE_NODE* temp=*node;
		*node=(*node)->right;

		destroy_node(temp);
		--bstree->size;
		return true;
	}
	return false;
}

/*delete all the right data*/
void bstree_remove(BSTREE* bstree,int data){
	while(bstree_erase(bstree,data));
}

/*clear*/
void bstree_clear(BSTREE* bstree){
	bstree_deinit(bstree);
}

/*updata*/
void bstree_updata(BSTREE* bstree,int _old, int _new){
	while(bstree_erase(bstree,_old))
		bstree_insert(bstree,_new);
}

/*there are ?*/
bool bstree_exist(BSTREE* bstree,int data){
	return *find(data,&bstree->root)!=NULL;
}

/**/
void bstree_travel(BSTREE* bstree){
	travel(bstree->root);
	printf("\n");
}

/*how many */
size_t bstree_size(BSTREE* bstree){
	return bstree->size;
}

/*height*/
size_t bstree_height(BSTREE* bstree){
	return height(bstree->root);
}

 

测试文件

#include<stdio.h>
#include<stdlib.h>
#include"bt.h"

int main(void){
	srand(time(NULL));
	BSTREE bstree;
	bstree_init(&bstree);
	for(int i=0;i<10;i++)
		bstree_insert(&bstree,rand()%100);
	bstree_travel(&bstree);
	bstree_clear(&bstree);

	bstree_insert(&bstree,50);
	bstree_insert(&bstree,70);
	bstree_insert(&bstree,20);
	bstree_insert(&bstree,60);
	bstree_insert(&bstree,40);
	bstree_insert(&bstree,30);
	bstree_insert(&bstree,10);
	bstree_insert(&bstree,90);
	bstree_insert(&bstree,80);

	bstree_travel(&bstree);

	printf("members:%u\n height:%u\n",bstree_size(&bstree),bstree_height(&bstree));

	bstree_erase(&bstree,20);
	bstree_travel(&bstree);

	bstree_insert(&bstree,70);
	bstree_insert(&bstree,70);
	bstree_updata(&bstree,70,200);
	bstree_travel(&bstree);
   
	bstree_remove(&bstree,200);
	bstree_travel(&bstree);
	
	if(bstree_exist(&bstree,20))
		printf("20 is in\n");
	else
		printf("20 isn't in\n");

	

	bstree_deinit(&bstree);
}

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一朝英雄拔剑起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值