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

article/2025/8/19 6:27:39

程序内功篇六--树

  • 一、树
    • 1、树的含义
    • 2、树的特点(选看)
    • 3、树的逻辑结构
  • 二、二叉树
    • 1、二叉树的含义
    • 2、二叉树性质
    • 3、二叉树-顺序存储
    • 4、二叉树-链式存储
    • 5、二叉树的遍历
    • 6、二叉树创建与遍历C程序的实现
      • (1)二叉树的创建
      • (2)前序遍历法
      • (3)中序遍历
      • (4)后序遍历
      • (4)层数遍历
  • 三、完整程序链接

一、树

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");#endifreturn 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 DEBUGprintf("r is NULL\n");#endifreturn 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语言程序实现


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


http://chatgpt.dhexx.cn/article/3Z9lkju0.shtml

相关文章

数据结构---与树相关的知识

与树有关的一系列知识: 树,二叉树,满二叉树,完全二叉树,文章还没完,我会后序补充的 一: 树(了解就行)1.1 概念1.2 一些与树相关的重要概念1.3 树的表示形式 二: 二叉树(非常重要,重点掌握)2.1 概念2.2 两种特殊的二叉树2.2.1 满二叉树2.2.2 完全二叉树 2.3 二叉树的性质2.4 二叉…

Java数据结构--树1

Java数据结构--树 一、二叉树入门1.1 树的基本定义1.2 树的相关术语1.3 二叉树的基本定义1.4 二叉查找树的创建1.4.1 二叉树的结点类1.4.2 二叉查找树API设计1.4.3 二叉查找树实现1.4.4 二叉查找树其他便捷方法1.4.4.1 查找二叉树中最小的键1.4.4.2 查找二叉树中最大的键 1.5 二…

树 一

文章目录 1.查找二分查找判定树 2. 树(Tree)2.1 树的术语2.2树的表示:儿子兄弟表示法 3. 二叉树(Binary Tree)3.1 特殊结构二叉树3.2 二叉树的性质3.3 二叉树的存储3.4二叉树的遍历 分层次组织管理上更有效地操作。 1.查找 静态查找&#xf…

树一:邂逅入门篇

一、树的概念 树是一种典型的非线性结构,是表达有层次特性的图结构的一种方法。 1.1 基本术语 术语描述空树当n0 时称为空树。根结点根结点是一个没有双亲结点的结点。一棵树最多一个。例如:A边结点之间的连线叶子结点没有孩子结点的结点。例如&#x…

树一:定义及存储

树的定义: 树是一种非线性的数据结构。树是由 n (n > 0) 个结点组成的有序集合。 如果 n 为0,称为空树;如果 n > 0, 则: 有一个结点称为根结点(root),它有直接后继,但没有直接…

mysql 创建索引规则

1、表的主键、外键必须有索引; 2、数据量超过300的表应该有索引; 3、经常与其他表进行连接的表,在连接字段上应该建立索引; 4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引; 5、…

mysql分区表之三:MySQL分区建索引,唯一索引

介绍 mysql分区后每个分区成了独立的文件,虽然从逻辑上还是一张表其实已经分成了多张独立的表,从“information_schema.INNODB_SYS_TABLES”系统表可以看到每个分区都存在独立的TABLE_ID,由于Innodb数据和索引都是保存在".ibd"文件当中&#…

分享mysql创建索引的3种方法

大家应该都知道索引的建立对于MySQL数据库的高效运行是很重要的,索引可以大大提升MySQL的检索速度,下面这篇文章主要给大家介绍了关于mysql创建索引的3种方法,需要的朋友可以参考下 1、使用CREATE INDEX创建,语法如下: 1 CREATE INDEX indexName ON tab…

js 监听浏览器刷新还是关闭事件

// $(window).bind(beforeunload,function(){return 您输入的内容尚未保存,确定离开此页面吗?;}); // window.onbeforeunload function() { return "确定离开此页面吗?"; }; // function myFunction() {return "自定…

浏览器刷新和页面手动为什么不一样?

Fiddler(2):AutoResponse修改返回结果_mb5fed6ec4336ce的技术博客_51CTO博客Fiddler(2):AutoResponse修改返回结果,前言怎么修改接口的返回数据呢步骤1.抓包,找到要拦截的请求,然后在AutoResponder中AddRule:2.在RuleEditor中的第…

vue监听浏览器刷新和关闭事件,并在页面关闭/刷新前发送请求

vue监听浏览器刷新和关闭事件,并在页面关闭/刷新前发送请求 1.需求背景:2.需求分析:3.实现方式:4.实现方式解析:1)浏览器页面事件基础2)在mounted监听beforeunload和unload事件 5.存在的问题/风…

浏览器刷新和关闭时显示提示信息

vue 刷新和关闭浏览器时显示提示信息 使用onbeforeunload事件 mounted() {window.onbeforeunload e > {e e || window.eventif (e) {e.returnValue 关闭提示}return 关闭提示}} }, beforeDestroy() {window.onbeforeunload null },如果是所有页面都需要页面销毁显示提…

【Vue实用功能】Vue监听浏览器刷新和关闭事件

Vue监听浏览器刷新和关闭事件 在前端开发中,我们通常会遇到这样的需求,用户离开、刷新页面前,修改数据未进行保存操作,需要提示框提醒用户 效果实现 methods: {/** 在刷新和关闭之前询问 **/beforeRefreshClose() {let self t…

vue监听浏览器刷新和关闭;

注意&#xff1a;区分不了浏览器是触发了刷新还是关闭&#xff0c;而且提示的弹框是无法自定义的&#xff1b;如果有大佬有方法能区分&#xff0c;还请评论学习一下&#xff01;感谢&#xff01; 代码可直接复制&#xff1a; <template><div><div /></di…

JS阻止浏览器刷新的方法

直接先给朋友们上阻止浏览器刷新的代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv&quo…

VSCODE同步浏览器刷新

VSCODE同步浏览器刷新 安装插件 live server

java中foreach的用法

文章目录 前言语法用法用法1&#xff1a;输出一维数组用法2&#xff1a;输出二维数组foreach的局限性什么是索引 总结 前言 java中foreach,可以认为是增强版的for语句循环&#xff0c;它可以减少代码量&#xff0c;但是不是所有的foreach都可以代替for循环。 语法 foreach的…

JAVA实现九九乘法表

用java语言实现九九乘法表&#xff0c;这里使用的是for循环 public class NineNineDemo{public static void main(String[] args){int i1;//对行变量赋值int j1;//对列变量赋值for(i1;i<9;i){for(j1;j<i;j){//行变量外循环&#xff1b;列变量内循环System.out.print(i&q…

Java的ASCII编码表

数字和字符的对照关系表&#xff08;编码表&#xff09;&#xff1a; ASCII码表&#xff1a;American Standard Code for Information Interchange, 美国信息交换标准代码。 Unicode码表&#xff1a;万国码。也是数字和符号的对照关系&#xff0c;开头0-127部分和ASCII完全一样…

JAVA——链表

一、链表概念及结构 链表&#xff1a;链表是一种物理存储结构上非连续存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的。如下图&#xff1a;&#xff08;通俗的说&#xff1a;就是由一个个节点组成&#xff0c;这些节点逻辑上连续&#xff0c;物理上…