数据结构(六):树与二叉树

一、树的基本概念

  1. 树的定义
    树(Tree)是由 n(n ≥ 0)个节点组成的有限集合,当 n = 0 时称为空树。非空树中:

    • 有且仅有一个根节点(Root);

    • 其余节点可以划分为若干个互不相交的子树,每个子树本身也是一棵树。

  2. 树的节点与术语

    • 节点包含数据和若干分支;

    • 度(Degree):节点拥有的子树数量;

    • 叶子节点:度为 0 的节点;

    • 非终端节点:度不为 0 的节点(又称分支节点);

    • 孩子(Child)双亲(Parent):节点间的直接连接关系;

    • 兄弟节点(Sibling):同一双亲下的节点;

    • 祖先与子孙:从根到某节点的路径上所有节点为祖先,某节点下所有子节点为子孙。

  3. 其他概念

    • 层次(Level):根为第一层,孩子为第二层,以此类推;

    • 深度(Depth)或高度:节点最大层次;

    • 有序树与无序树:若子树顺序不能交换则为有序树,否则为无序树。


二、树的存储结构

树的存储可分为:

  • 顺序结构(如数组);

  • 链式结构(如链表);
    实际开发中,树通常采用链式结构实现。


三、二叉树的基本概念

  1. 定义
    二叉树是每个节点最多有两个子树(左子树和右子树)的树结构。这两个子树有先后顺序,不能颠倒。二叉树可能为空,也可能只有一个根节点。

  2. 特点

    • 节点度最大为 2;

    • 必须区分左子树和右子树,即使只有一个孩子;

    • 子树顺序不可交换。

  3. 二叉树的五种基本形态

    • 空二叉树;

    • 只有根节点;

    • 只有左子树;

    • 只有右子树;

    • 同时有左右子树。


四、特殊的二叉树

  1. 斜树

    • 左斜树:每个节点只有左子树;

    • 右斜树:每个节点只有右子树。

  2. 满二叉树
    满足:

    • 所有非叶子节点都有左右两个子树;

    • 所有叶子节点都在同一层;

    • 特点:整棵树结构完全对称,节点数最多。

  3. 完全二叉树
    满足:

    • 叶子只出现在最下两层;

    • 最下层叶子靠左连续;

    • 最后一层若不满,叶子也必须靠左;

    • 同样节点数下,深度最小。


五、二叉树的性质(重点公式)

  1. i 层最多有 2^(i-1) 个节点(i≥1)

  2. 深度为 k 的二叉树最多有 2^k - 1 个节点

  3. 叶子数 = 度为 2 的节点数 + 1

  4. n 个节点的完全二叉树深度为 log₂(n) + 1

  5. 编号为 i 的节点:

    • i=1,它是根节点;

    • 左孩子编号为 2i

    • 右孩子编号为 2i + 1(若存在);

    • 双亲编号为 i / 2(i > 1 时)。


六、二叉树的遍历方式

  1. 前序遍历:根 → 左 → 右

  2. 中序遍历:左 → 根 → 右

  3. 后序遍历:左 → 右 → 根

注:遍历时虽然“根”在描述中写在前面,但实际执行顺序是递归的,需要先进入子树再处理根节点。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef char DataType;typedef struct BiTNode
{DataType data;struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode;char data[] = "Abd#g###ce#h##fi###";int ind = 0;void CreateTree(BiTNode **root)
{char c = data[ind++];if('#' == c){*root = NULL;return ;}else{*root = malloc(sizeof(BiTNode));if(*root == NULL){printf("malloc errror\n");*root = NULL;return ;}(*root)->data = c;CreateTree(&(*root)->lchild);CreateTree(&(*root)->rchild);}return ;
}
//根左右
void PreOrderTraverse(BiTNode *root)
{if(NULL == root){return ;}else{printf("%c", root->data);PreOrderTraverse((*root).lchild);PreOrderTraverse((*root).rchild);}return ;
}
//左根右
void InOrderTraverse(BiTNode *root)
{if(NULL == root){return ;}else{InOrderTraverse(root->lchild);printf("%c", root->data);InOrderTraverse(root->rchild);return ;}
}//左右根
void PostOrderTraverse(BiTNode *root)
{if (NULL == root){return;}PostOrderTraverse(root->lchild);PostOrderTraverse(root->rchild);printf("%c", root->data);return;
}void DestroyTree(BiTNode *root)
{if (NULL == root){return;}DestroyTree(root->lchild);DestroyTree(root->rchild);free(root);root = NULL;return;
}int main(int argc, char const *argv[])
{BiTNode *root;CreateTree(&root);PreOrderTraverse(root);printf("\n");InOrderTraverse(root);printf("\n");PostOrderTraverse(root);printf("\n");DestroyTree(root);root = NULL;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92398.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Linux运维总结:Shell 脚本日志输出工具》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;Linux运维实战总结 一、Shell 脚本日志输出工具 1、提供的 logger() 函数是一个非常实用的 Shell 脚本日志输出工具&#xff0c;它支持带时间戳和…

select ... for update阻塞

总结阻塞规则&#xff1a;当前事务持有的锁 (来自 SELECT ... FOR UPDATE)其他事务尝试的操作是否会被阻塞&#xff1f;原因排他锁 (X Lock) 在行 R 上SELECT ... FROM ... (普通查询)否读快照 (MVCC)&#xff0c;不需要锁排他锁 (X Lock) 在行 R 上SELECT ... FROM ... FOR UP…

LangChain4j终极指南:Spring Boot构建企业级Agent框架

LangChain4j Spring Boot 构建企业级 Agent 框架深度指南&#xff08;3000字终极版&#xff09;一、架构设计&#xff1a;面向未来的企业级智能体系统1.1 分层架构设计1.2 核心组件职责1.3 企业级特性设计二、核心模块深度实现2.1 智能体协作引擎&#xff08;LangGraph4j高级应…

前端基础之《Vue(29)—Vue3 路由V4》

一、安装1、命令cnpm install vue-router42、配置映射为src路径&#xff08;1&#xff09;安装对应配置cnpm install types/node&#xff08;2&#xff09;配置vite.config.tsimport { defineConfig } from vite import vue from vitejs/plugin-vue import * as path from &quo…

9.2 通过DuEDrawingControl把eDrawing嵌入到C#中显示

本文介绍如何通过DuEDrawingControl控件在C#的WPF中进行3D的显示。 DuEDrawingControl在实际应用中可以应用于以下场景: 1.CAD文件预览:在Winform或WPF应用程序中,用户可以预览装配文件、工程图文件等,方便进行设计和审核。 2.打印管理:控件支持打印文件的管理,用…

《Vuejs设计与实现》第 13 章(异步组件和函数式组件

目录 13.1 异步组件的问题与解决方法 13.2 异步组件的实现原理 3.2.1 封装 defineAsyncComponent 函数 13.2.2 超时与 Error 组件 13.2.3 延迟与 Loading 组件 13.2.4 重试机制 13.3 函数式组件 13.4 总结 在第12章&#xff0c;我们深入探讨了组件的基本含义和实现方式…

Python的七大框架对比分析

谈到“Python 七大框架”时&#xff0c;通常指 Django、Flask、FastAPI、Tornado、Sanic、AIOHTTP 和 Pyramid 这七位“常驻嘉宾”。它们各有气质&#xff0c;适合的场景也截然不同。1. DjangoDjango 像一辆全副武装的重型越野&#xff1a;出厂就配好 ORM、后台管理、权限、缓存…

Redis中String数据结构为什么以长度44为embstr和raw实现的分界线?

​ 一道常见Redis面试题。 ​ 在Redis的String数据结构中&#xff0c;当字符串的实际长度小于44且包含非整数字符时底层编码方式为embstr。当超过44时使用raw底层编码方式。 ​ 那么为什么要以字符串的长度44为分界线呢&#xff1f; 信息一 ​ 首先要分析embst…

告别人工巡查,校园空调管理迈入智能物联高效时代

在“双碳”战略深入推进和智慧校园建设加速落地的背景下&#xff0c;学校空调的用电管理已经不再是“开与关”的简单问题&#xff0c;而是涵盖了能效优化、安全保障、智慧化管理的综合课题。蓝奥声科技凭借LPIOT低功耗物联网、ECWAN边缘协同网络等优势技术&#xff0c;打造出面…

Access开发右下角浮窗提醒

Hi&#xff0c;大家好呀&#xff01;感觉又有很长一段时间没有给大家更新内容了&#xff0c;最近一直在忙&#xff0c;给大家承诺的框架、视频教程、直播等等感觉又要跳票了&#xff0c;嘿嘿&#xff0c;但大家还是不要急&#xff0c;莫催我&#xff0c;我会慢慢都更新出来的&a…

AI自进化,GPU性能翻三倍——CUDA-L1开启自动优化新范式

最近看到一篇让我挺震撼的文章&#xff0c;来自 DeepReinforce 团队发布的一个新框架——CUDA-L1。说实话&#xff0c;刚看到标题说“AI 让 GPU 性能提升 3 倍以上”&#xff0c;我心里是有点怀疑的。毕竟我们搞科研的都知道&#xff0c;这种宣传语很多时候水分不小。但当我静下…

深入理解 Java AWT Container:原理、实战与性能优化

以 Container 为核心梳理 AWT 容器体系与事件模型&#xff0c;提供可运行的纯 AWT 示例&#xff08;含 Panel、Frame、Dialog、ScrollPane 正确用法&#xff09;&#xff0c;并给出常见问题与性能优化建议。 Java AWT, Container, 容器, 布局管理器, 事件驱动, ScrollPane, 性…

redis--黑马点评--用户签到模块详解

用户签到假如我们使用一张表来存储用户签到信息&#xff0c;其结构应该如下&#xff1a;CREATE TABLE tb_sign (id bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 主键,user_id bigint unsigned NOT NULL COMMENT 用户id,year year NOT NULL COMMENT 签到的年,month tinyin…

Shell、Python对比

在 Shell 脚本&#xff08;sh/bash&#xff09; 和 Python 之间选择时&#xff0c;主要取决于具体的使用场景和需求。以下是两者的对比分析&#xff0c;帮助你判断哪种更方便&#xff1a;1. Shell 脚本&#xff08;sh/bash&#xff09;的优势适用场景系统管理任务&#xff1a;如…

自适应反步控制:理论与设计

自适应反步控制 文章目录自适应反步控制1. 基本思想A. 第一步B. 第二步1. 基本思想 基于传统反步法&#xff0c;考虑了系统方程中以线性形式出现的未知参数。核心思想包括参数估计率和控制率。 考虑二阶系统&#xff1a; {x˙1x2φ1T(x1)θx˙2uφ2T(x1,x2)θ(1)\begin{cases…

[Oracle] LEAST()函数

LEAST() 是 Oracle 中一个非常有用的函数&#xff0c;用于从一组表达式中返回最小值LEAST()函数会从给定的参数列表中返回最小的值&#xff0c;它与GREATEST()函数正好相反语法格式LEAST(expr1, expr2 [, expr3, ...])参数说明expr1, expr2, ...&#xff1a;要比较的表达式(至少…

SVM算法实战应用

目录 用 SVM 实现鸢尾花数据集分类&#xff1a;从代码到可视化全解析 一、算法原理简述 二、完整代码实现 三、代码解析 1. 导入所需库 2. 加载并处理数据 3. 划分训练集和测试集 4. 训练 SVM 模型 5. 计算决策边界参数 6. 生成决策边界数据 7. 绘制样本点 8. 绘制…

深度虚值期权合约有什么特点?

本文主要介绍深度虚值期权合约有什么特点&#xff1f;深度虚值期权合约是期权市场中一类特殊且风险收益特征鲜明的合约&#xff0c;其核心特点可归纳为以下六点。深度虚值期权合约有什么特点&#xff1f;一、定义&#xff1a;执行价与标的价差距极大深度虚值期权是指执行价&…

(LeetCode 面试经典 150 题) 86. 分隔链表(链表+双指针)

题目&#xff1a;86. 分隔链表 思路&#xff1a;双指针&#xff0c;时间复杂度0(n)。 双指针来维护小于x的链表和不小于x的链表即可&#xff0c;后面将两个链表连起来即可。 C版本&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* …

安全扫描:检测到目标站点存在javascript框架库漏洞问题(vue)

如果升级Vue版本有限制或者时间比较紧急&#xff0c;可以暂时用下面方式来&#xff0c;规避检测到目标站点存在javascript框架库vue漏洞。 在 vue.config.js 中配置: module.exports {configureWebpack: {optimization: {minimizer: [new (require(terser-webpack-plugin))({t…