IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【数据结构与算法】程序内功篇六--树 -> 正文阅读

[数据结构与算法]【数据结构与算法】程序内功篇六--树

一、树

1、树的含义

树(Tree)n(n≥0)个节点有限集合T,它满足两个条件 :

  • 有且仅有一个特定的称为根(Root)的节点
  • 其余的节点可以分为m(m≥0)个互不相交的有限集合T1、T2、……、Tm,其中每一个集合又是一棵树,并称为其根的子树

表示方法 :树形表示法目录表示法

在这里插入图片描述


2、树的特点(选看)

(1)结点与度数

  • 一个节点子树的个数称为该节点的度数
  • 一棵树的度数是指该树中节点的最大度数
  • 度数为零节点称为树叶终端节点
  • 度数不为零的节点称为分支节点
  • 除根节点外的分支节点称为内部节点
    在这里插入图片描述

(2)路径与层数

  • 一个节点系列k1,k2, ……,ki,ki+1, ……,kj,并满足kiki+1父节点,就称为一条从k1到kj的路径
  • 路径的长度为j-1,即路径中的边数
  • 路径中前面的节点是后面节点的祖先,后面节点是前面节点的子孙。
  • 节点的层数等于父节点的层数加一根节点的层数定义为一。树中节点层数的最大值称为该树的高度或深度。
    在这里插入图片描述

(3)有序树与森林

  • 若树中每个节点各个子树的排列为从左到右,不能交换,即兄弟之间是有序的,则该树称为有序树
  • m(m≥0)棵互不相交树的集合称为森林
  • 树去掉根节点就成为森林森林加上一个新的根节点就成为树。

3、树的逻辑结构

树中任何节点都可以有零个或多个直接后继节点(子节点),但至多只有一个直接前趋节点(父节点),根节点没有前趋节点,叶节点没有后继节点


二、二叉树

1、二叉树的含义

二叉树n(n≥0)节点有限集合或者是空集(n=0)或者是由一个根节点以及两棵互不相交的.
分别称为左子树右子树二叉树组成
严格区分左孩子和右孩子即使只有一个子节点也要区分左右
在这里插入图片描述


2、二叉树性质

  • 二叉树第i(i≥1)层上的节点最多2^(i-1)个。
  • 深度k(k≥1)的二叉树最多有2^k-1个节点。

满二叉树 :深度为k(k≥1)时有2k-1个节点的二叉树。

完全二叉树 :只有最下面两层度数小于2节点,且最下面一层叶节点集中在最左边的若干位置上

具有n个节点的完全二叉树的深度为
	 (log2n)+1或 log2(n+1)。

3、二叉树-顺序存储

顺序存储结构完全二叉树节点编号方法从上到下从左到右,根节点为1号节点。设完全二叉树的节点数为n,某节点编号为i

  • i>1(不是根节点)时,有父节点,其编号为i/2;
  • 2*i≤n时,有左孩子,其编号为2*i ,否则没有左孩子,本身是叶节点;
  • 2*i+1≤n时,有右孩子,其编号为2*i+1 ,否则没有右孩子;
  • i为奇数且不为1时,有左兄弟,其编号为i-1,否则没有左兄弟;
  • i为偶数且小于n时,有右兄弟,其编号为i+1,否则没有右兄弟;

n个节点完全二叉树可以用有n+1个元素数组进行顺序存储节点号数组下标一一对应,下标为零的元素不用。

利用以上特性,可以从下标获得节点的逻辑关系不完全二叉树通过添加虚节点构成完全二叉树,然后用数组存储这要浪费一些存储空间
在这里插入图片描述


4、二叉树-链式存储

示意图:
在这里插入图片描述
结构体定义:

typedef char datatype;  
typedef struct node_t
{
	datatype data;  //序号
	struct node_t *left_tree;  //左结点指针
	struct node_t *right_tree; //右结点指针
}bittree;

5、二叉树的遍历

遍历沿某条搜索路径周游二叉树,对树中的每一个节点访问一次且仅访问一次

二叉树非线性结构每个结点有两个后继,则存在如何遍历即按什么样的搜索路径进行遍历的问题。

由于二叉树的递归性质,遍历算法也是递归的。

三种基本的遍历算法如下 :

  • 先序序列:先访问树根,再访问左子树,最后访问右子树;
  • 中序序列:先访问左子树,再访问树根,最后访问右子树;
  • 后序序列:先访问左子树,再访问右子树,最后访问树根;
    示例:
    在这里插入图片描述

6、二叉树创建与遍历C程序的实现

(1)二叉树的创建

/**
 * @description: 二叉树的创建
 * @param {*}
 * @return {r-二叉树根节点的地址}
 */
bittree *tree_create()
{
	datatype value;
	bittree *r;

	scanf("%c", &value);
	if(value == '#')
		return NULL;

	r = (bittree *)malloc(sizeof(bittree));
	if(r == NULL)
	{
		#if DEBUG 
		printf("bittree create error!\n");
		#endif
		return NULL;
	}

	r->data = value;

	r->left_tree = tree_create();
	r->right_tree = tree_create();

	return r;
}

(2)前序遍历法

/**
 * @description: 前序遍历法
 * @param {bittree} *r-二叉树根节点的地址
 * @return {0-没有子结点时,1-函数结点}
 */
int preorder(bittree *r)
{
	if(r == NULL)
		return 0;
	printf("%c ", r->data);
	preorder(r->left_tree);
	preorder(r->right_tree);

	return 1;
}

(3)中序遍历

/**
 * @description: 中序遍历
 * @param {bittree} *r-二叉树根节点的地址
 * @return {0-没有子结点时,1-函数结点}
 */
int inorder(bittree *r)
{
	if(r == NULL)
		return 0;
	inorder(r->left_tree);
	printf("%c ", r->data);
	inorder(r->right_tree);

	return 1;
}

(4)后序遍历

/**
 * @description: 后序遍历
 * @param {bittree} *r-二叉树根节点的地址
 * @return {0-没有子结点时,1-函数结点}
 */
int backorder(bittree *r)
{
	if(r == NULL)
		return 0;
	backorder(r->left_tree);
	backorder(r->right_tree);
	printf("%c ", r->data);

	return 1;
}

(4)层数遍历

需要应用链表队列

/**
 * @description: 层次遍历
 * @param {bittree} *r-二叉树根节点的地址
 * @return {0-函数失败,1-函数成功}
 */
int levelorder(bittree *r)
{
	linkqueue lq;
	if(r == NULL)
	{
		#if DEBUG
		printf("r is NULL\n");
		#endif
		return 0;
	}

	if((lq = linkqueue_create()) == NULL)
		return 0;
	linkqueue_enter(lq, r);
	while(!linkqueue_empty(lq))
	{
		r = linkqueue_out(lq);
		printf("%c ",r->data);
		if(r->left_tree != NULL)
			linkqueue_enter(lq, r->left_tree);
		if(r->right_tree != NULL)
			linkqueue_enter(lq, r->right_tree);
	}
	puts("");

	return 1;
}

三、完整程序链接

二叉树C语言程序实现


到这里就结束啦!
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 22:03:13  更:2022-03-13 22:03:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:40:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码