当前位置: 首页 > article >正文

【数据结构与算法】树,森林,二叉树之间的转换

树的定义递归定义树是满足以下条件的结构有且仅有一个根节点没有父节点的节点其他节点分成m 个互不相交的子树每个子树本身也是一棵树树的基本术语术语解释例子根节点最顶层的节点没有父节点文件夹系统的根目录父节点直接上层节点上一级文件夹子节点直接下层节点文件夹里的内容兄弟节点同一父节点的节点同一文件夹下的子文件夹叶子节点没有子节点的节点文件不是文件夹度一个节点拥有的子节点个数文件夹里有几个项目深度/层次根节点到该节点的路径长度文件在第几层目录树的图示根节点 A第1层度为3 / | \ B C D第2层C的度为2 / \ E F第3层叶子节点树的特点没有回路不会形成环节点之间有明确的层级关系每个节点只有一个父节点除了根树是连通的从根可以到达任何节点森林Forest是什么森林就是m 棵互不相交的树的集合m ≥ 0。通俗理解一棵树就像你电脑里的一个文件夹系统森林就像整个硬盘里的多个独立的文件夹系统C盘、D盘、E盘它们之间没有关联森林的图示森林 多棵独立的树 树1 树2 树3 A X M / \ | | B C Y N | | D O 这三棵树之间没有连线相互独立森林与树的关系关系说明树是特殊的森林森林可以是1棵树m1森林可以变成树加一个虚拟根节点把多棵树连起来树可以变成森林删除根节点剩下的子树就是森林关键联系删掉树的根节点剩下的就是森林给森林加一个虚拟根节点就变成一棵树三、树的分类类型特点例子二叉树每个节点最多2个子节点表达式树、排序树满二叉树所有节点都有0或2个子节点完美平衡的二叉树完全二叉树除了最后一层其他层都填满堆Heap二叉搜索树左子树 根 右子树快速查找多叉树每个节点可以有多个子节点文件系统、B树平衡树左右子树高度差不超过1AVL树、红黑树二叉树Binary Tree是什么二叉树是一种特殊的树结构它的核心约束是每个节点最多只能有两个子节点分别称为左子节点和右子节点。二叉树 vs 普通树对比普通树二叉树节点度数任意可以有多个子节点最多2个0、1或2子节点顺序通常无序严格区分左右有序表示方式孩子兄弟表示法转二叉树标准二叉链表关键区别普通树一个节点可以有 3 个、5 个甚至更多孩子二叉树一个节点最多 2 个孩子并且区分左右二、二叉树的五种基本形态1. 空二叉树 2. 只有根节点 3. 只有左子树 ( ) A A / / B 4. 只有右子树 5. 左右子树都有 A A \ / \ B B C三、特殊二叉树类型定义图示特点满二叉树所有非叶子节点都有两个子节点且所有叶子节点在同一层每层都填满节点数 2^h - 1h为高度完全二叉树除了最后一层其他层都填满最后一层节点尽量靠左堆的结构可以用数组存储索引计算方便二叉搜索树左子树所有节点 根节点 右子树所有节点中序遍历有序查找/插入/删除 O(log n)平衡二叉树任意节点的左右子树高度差 ≤ 1AVL树、红黑树防止退化成链表完美二叉树同满二叉树每个节点都有0或2个子节点-图示对比满二叉树 完全二叉树 不完全二叉树 1 1 1 / \ / \ / \ 2 3 2 3 2 3 / \ / \ / \ / / \ 4 5 6 7 4 5 6 4 5 \ 6四、二叉树的重要性质性质公式说明第i层最多节点数2^(i-1)i ≥ 1高度为h的树最多节点数2^h - 1h ≥ 1根高度为1叶子节点数关系n0 n2 1n0叶子数n2度为2的节点数完全二叉树节点编号左孩子2i右孩子2i1根从1开始完全二叉树高度⌊log2 n⌋ 1n为节点数树 → 二叉树的转换方法一三步法容易理解原树textA / | \ B C D / \ E FStep 1加线连接兄弟将同一父节点的兄弟节点用线连起来textA / | \ B--C--D / \ E--FStep 2删线只保留长子每个节点只保留与第一个孩子的连线删除与其他孩子的连线textA / B \ C / \ E D \ F解释A只保留与B的连线删除与C、D的连线C只保留与E的连线删除与D的连线等等D不是C的孩子是兄弟实际上这一步要小心处理让我重新做Step 2正确版删线text原树连线 A-B, A-C, A-D, C-E, C-F 删除A-C, A-D只保留A-B C-F? C-E保留E是第一个孩子 C-D? C和D不是父子关系 结果 A → B C → E 其他连线B、C、D之间的关系还没处理其实更清晰的方法是直接用法二。方法二直接法推荐直接按照左孩子右兄弟规则构建原树textA / | \ B C D / \ E F逐节点转换节点第一个孩子下一个兄弟二叉树表示AB无A.left B, A.right nullB无CB.left null, B.right CCEDC.left E, C.right DD无无D.left null, D.right nullE无FE.left null, E.right FF无无F.left null, F.right null最终二叉树textA / B \ C / \ E D \ F验证A的左孩子是B ✓B是A的第一个孩子B的右孩子是C ✓C是B的下一个兄弟C的左孩子是E ✓E是C的第一个孩子C的右孩子是D ✓D是C的下一个兄弟E的右孩子是F ✓F是E的下一个兄弟三、更复杂的例子原树text1 / | \ 2 3 4 / \ | 5 6 7 | 8逐节点分析节点第一个孩子下一个兄弟二叉树12无left2, rightnull253left5, right33无4leftnull, right447无left7, rightnull5无6leftnull, right668无left8, rightnull7无无leftnull, rightnull8无无leftnull, rightnull转换后的二叉树text1 / 2 / \ 5 3 \ \ 6 4 / / 8 7图解text1 / 2 / \ 5 3 \ \ 6 4 / 8 \ 7? 等等这里有问题 让我重新画正确的实际上更清晰的画法用缩进表示层级text1 └─ 2 (左) ├─ 5 (左) │ └─ 6 (右) │ └─ 8 (左) └─ 3 (右) └─ 4 (右) └─ 7 (左)#include iostream #include vector #include queue using namespace std; // 原树的节点普通树度不限 struct TreeNode { int val; vectorTreeNode* children; // 可以有多个孩子 TreeNode(int x) : val(x) {} }; // 二叉树的节点 struct BinaryTreeNode { int val; BinaryTreeNode* left; // 第一个孩子 BinaryTreeNode* right; // 下一个兄弟 BinaryTreeNode(int x) : val(x), left(NULL), right(NULL) {} }; // 树 → 二叉树 BinaryTreeNode* treeToBinaryTree(TreeNode* root) { if (root NULL) return NULL; // 创建二叉树节点 BinaryTreeNode* binaryRoot new BinaryTreeNode(root-val); // 处理第一个孩子左指针 if (!root-children.empty()) { binaryRoot-left treeToBinaryTree(root-children[0]); } // 处理兄弟节点右指针 // 注意原树的兄弟关系需要额外处理 BinaryTreeNode* current binaryRoot-left; for (int i 1; i root-children.size(); i) { current-right treeToBinaryTree(root-children[i]); current current-right; } return binaryRoot; } // 更简洁的递归版本推荐 BinaryTreeNode* convert(TreeNode* root) { if (root NULL) return NULL; BinaryTreeNode* binaryNode new BinaryTreeNode(root-val); // 第一个孩子成为左孩子 if (!root-children.empty()) { binaryNode-left convert(root-children[0]); } // 剩下的孩子成为右链兄弟关系 BinaryTreeNode* p binaryNode-left; for (int i 1; i root-children.size(); i) { p-right convert(root-children[i]); p p-right; } return binaryNode; } // 辅助函数打印二叉树先序遍历 void printBinaryTree(BinaryTreeNode* root) { if (root NULL) return; cout root-val ; printBinaryTree(root-left); printBinaryTree(root-right); } // 测试 int main() { // 构建原树 // 1 // /|\ // 2 3 4 // / \ // 5 6 TreeNode* root new TreeNode(1); root-children.push_back(new TreeNode(2)); root-children.push_back(new TreeNode(3)); root-children.push_back(new TreeNode(4)); root-children[0]-children.push_back(new TreeNode(5)); root-children[0]-children.push_back(new TreeNode(6)); // 转换 BinaryTreeNode* binaryRoot convert(root); // 输出转换结果 cout 转换后的二叉树先序遍历: ; printBinaryTree(binaryRoot); // 预期输出1 2 5 6 3 4 // 这对应原树的先根遍历顺序 return 0; }就是按每一层来看每一层的某几个节点如果是同一个父节点就把最左边的那个点和父节点相连接其他点变成最左边那个点右的孩子对于同一父节点的多个孩子 第1个孩子 → 挂在父节点的【左指针】上 第2个孩子 → 挂在第1个孩子的【右指针】上 第3个孩子 → 挂在第2个孩子的【右指针】上 ... 第k个孩子 → 挂在第(k-1)个孩子的【右指针】上森林 → 二叉树的转换你的理解已经非常好了森林转换就是在树转二叉树的基础上再多做一步把多棵树的根节点串起来。核心规则在你的理解上扩展森林 多棵独立的树转换步骤先将每棵树分别转换成二叉树用你刚学会的方法父连长子长子连兄弟把第一棵树的根作为总根把第二棵树的根作为第一棵树根的右孩子把第三棵树的根作为第二棵树根的右孩子以此类推...口诀树转二叉根串成链

相关文章:

【数据结构与算法】树,森林,二叉树之间的转换

树的定义(递归定义)树是满足以下条件的结构:有且仅有一个根节点(没有父节点的节点)其他节点分成 m 个互不相交的子树每个子树本身也是一棵树树的基本术语术语解释例子根节点最顶层的节点,没有父节点文件夹系…...

百考通:AI精准驱动数据分析,让数据价值高效落地

在数字化浪潮席卷各行各业的今天,数据已成为核心生产要素,但如何从海量数据中挖掘价值、辅助决策,始终是企业与个人面临的核心难题。传统数据分析流程繁琐、技术门槛高、周期漫长,让许多非专业人士望而却步。百考通(ht…...

百考通:AI精准赋能实践报告,让实习总结高效又专业

对于每一位在校学生和职场新人而言,实践报告都是记录成长、沉淀经验的关键载体,却也常常成为令人头疼的难题:要么不知如何梳理工作脉络,要么难以精准提炼收获与反思,要么在格式规范和字数要求上反复纠结。百考通&#…...

百川2-13B-4bits量化版API优化:降低OpenClaw任务Token消耗20%

百川2-13B-4bits量化版API优化:降低OpenClaw任务Token消耗20% 1. 问题背景与优化动机 上周在调试OpenClaw自动化流程时,我发现一个奇怪现象:同样的文件整理任务,在不同时段运行时消耗的Token数量差异能达到30%。作为个人开发者&…...

为什么2026年还有企业在用Excel算工资?新工具提升HR工作效率

HR工资系统软件是帮助企业实现薪酬自动化核算、个税申报、社保公积金管理的数字化工具。现代工资系统通常集成考勤、绩效、人事等模块,支持复杂薪酬规则配置,将HR从每月耗时数天的手工算薪中解放出来,准确率提升至99.9%以上。 为什么2026年还…...

标普油气ETF富国(513350.SH)逆势走强、半导体承压:地缘扰动与产业逻辑共振下的ETF分化走势

4月2日,市场全天震荡调整,创业板指、科创50指数均跌超2%。板块方面,医药板块逆势走强,油气股表现活跃,光纤概念反复走强;算力租赁概念集体调整。ETF方面,标普油气ETF富国(513350.SH&…...

2026 年4月深圳高精度 TOF 传感器,这些推荐值得关注!

随着科技的飞速发展,高精度TOF(Time of Flight)传感器在众多领域的应用越来越广泛。从智能家居到自动驾驶,从工业自动化到医疗成像,TOF传感器的市场需求呈现出爆发式增长。今天,我们就来聊聊2026年值得关注…...

RK Android14 开机自启APP分析与使用

文章目录 前言 一、功能补丁 二、如何使用 1. 应用补丁 2. 设置自启动应用 3. 获取应用包名和Activity 4. 验证 总结 前言 根据客户需要,有时需要设置第三方的apk进行开机自启动。 一、功能补丁 功能分析: 系统启动完成后,自动启动系统属性 persist.sys.start.app 中配置的…...

医疗AI推理可视化卡顿难题(实时渲染延迟>120ms?)——三甲医院PACS系统C++底层优化全链路拆解

第一章:医疗AI推理可视化卡顿难题的临床影响与性能基线定义在放射科、病理科及急诊超声等实时决策场景中,AI模型输出热力图、分割掩码或病灶定位框后,若前端渲染延迟超过300ms,将直接干扰医师对动态影像序列(如心脏搏动…...

OpenClaw日志分析实战:Phi-3-vision-128k-instruct多维度错误模式识别

OpenClaw日志分析实战:Phi-3-vision-128k-instruct多维度错误模式识别 1. 为什么需要智能日志分析 凌晨三点,我被手机警报惊醒——服务器又崩了。揉着惺忪睡眼打开终端,面对满屏的日志文件,那种熟悉的无力感再次袭来。这已经是本…...

复古计算机复兴:OpenClaw+Qwen3-14B驱动命令行工作流

复古计算机复兴:OpenClawQwen3-14B驱动命令行工作流 1. 当AI遇见Unix哲学 我的书桌上至今保留着一台1984年的IBM PC/AT,那厚重的机械键盘和闪烁的绿色光标总能唤起某种仪式感。最近在调试OpenClaw对接Qwen3-14B时,突然意识到:我…...

MS5611高精度气压温度传感器Arduino驱动库

1. 项目概述MS5611-Mike-Refactored 是一款面向嵌入式平台(特别是 Arduino 兼容生态)的 MS5611 高精度气压/温度传感器驱动库。该库并非简单封装,而是对 Korneliusz Jarzebski 原始实现的一次系统性重构与工程化增强。其核心目标是将一个基础…...

mbedBug:面向mbed OS的轻量级嵌入式调试纳米框架

1. mbedBug:面向mbed OS的轻量级嵌入式调试纳米框架1.1 设计定位与工程价值mbedBug并非通用型调试器或完整测试框架,而是一个专为资源受限嵌入式环境裁剪的调试纳米框架(Debug Nanoframework)。其核心设计哲学是“最小侵入、最大可…...

有了这个Python备忘录,代码拿来即用

这段时间代码写的少了,周末用python写一个小爬虫,却发现连线程的一些方法都不记得了,还得百度查教程。工作越忙,记性越差,发现我疏远了代码,代码也疏远了我。 PS:对于小白来说自学也不是件容易…...

OpenClaw跨平台控制:Kimi-VL-A3B-Thinking远程执行多模态任务方案

OpenClaw跨平台控制:Kimi-VL-A3B-Thinking远程执行多模态任务方案 1. 为什么需要跨平台远程控制? 上周五晚上11点,我正躺在沙发上刷手机,突然想起有个紧急的竞品分析报告需要处理。电脑在书房,实在懒得起身。这时我意…...

东华OJ-基础题-33-数字之和(C++)

问题描述 输入一个正整数,求这个正整数的各位数字之和。输入说明 你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组测试数据为正整数,每行一个N,N小于20000输出说明 对每组测试数据,你的程…...

TimesFM时间序列预测模型实战:从基础模型到高效部署的完整路径

TimesFM时间序列预测模型实战:从基础模型到高效部署的完整路径 【免费下载链接】timesfm TimesFM (Time Series Foundation Model) is a pretrained time-series foundation model developed by Google Research for time-series forecasting. 项目地址: https://…...

快捷键失灵?让Hotkey Detective揪出幕后“键盘小偷“——专业级Windows热键冲突解决方案

快捷键失灵?让Hotkey Detective揪出幕后"键盘小偷"——专业级Windows热键冲突解决方案 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_m…...

2025_NIPS_RT V-Bench: Benchmarking MLLM Continuous Perception, Understanding and Reasoning through R

文章主要内容与创新点总结 一、主要内容 本文针对现有基准测试无法充分评估多模态大语言模型(MLLMs)在动态真实环境中持续感知、理解和推理能力的问题,提出了实时视频分析基准测试集RT V-Bench。该基准包含552个多样化视频(总时长167.2小时)和4631个高质量问答对,涵盖智…...

3 个高级思路,让你的 AI 绘画 / 视频从此充满想象力

前言 如今 AI 视频与绘画工具的画质越来越卷,清晰度、光影、细节几乎都已触达天花板。但真正能让人记住、能脱颖而出的作品,靠的从来不是画质,而是想象力。 当所有人都在追求 “大片感” 时,你只需要换一种思路 ——用创意打破平…...

Spring IoC 与 DI 核心详解 —— 基于 XML 配置:Bean 创建、依赖注入与生命周期全解析(Spring系列1)

在 Java 企业级开发中,Spring 框架凭借其强大的 IoC(控制反转) 与 DI(依赖注入) 能力,成为了事实上的标准。本文将带你从最原始的 XML 配置开始,逐步过渡到纯注解开发,并深入剖析 Io…...

ReactNative项目OpenHarmony三方库集成实战:react-native-render-html

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 项目基于 RN 0.72.90 开发 📋 前言 在移动应用开发中,HTML 内容渲染是一项常见需求,特别是在新闻资讯、富文本编辑、邮件展示等场景中。React Native 原…...

状态机中的人物状态

一,人物惯性移动using System.Collections; using System.Collections.Generic; using UnityEngine;public class CharMove3 : MonoBehaviour {public Transform charTrans; //角色坐标public Vector3 currentVelocity; //当前速度public float maxSpeed; //最大速率…...

Diablo Edit2实战解决方案:从存档修复到角色定制的完整指南

Diablo Edit2实战解决方案:从存档修复到角色定制的完整指南 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 在暗黑破坏神II的冒险旅程中,每位玩家都可能遭遇存档损坏、属性…...

新手福音:用快马平台理解openclaw架构图并生成你的第一个应用

新手福音:用快马平台理解openclaw架构图并生成你的第一个应用 作为一个刚入门的开发者,第一次看到openclaw架构图时,那些方框和箭头让我一头雾水。直到在InsCode(快马)平台上动手实践后,才发现原来架构图可以这么直观。下面分享我…...

关于eclipse2019中导入克隆的web项目

分为导入项目和排查可能错误两个方面前言:本文主要总结个人在完成需要合作完成学习项目时,使用共享项目文件时“环境”问题导致的无法“跑通”,为此忙碌很久和豆包进行了“深入聊天”。决定对自己的问题进行总结,方便自己以后阅读…...

小红书内容保存难题,这款Python工具如何实现一键无水印下载?

小红书内容保存难题,这款Python工具如何实现一键无水印下载? 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作…...

基于YOLOv8深度学习的电梯内电动车检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)

一、项目介绍 项目摘要 随着城市化进程的加速,电梯已成为现代建筑中不可或缺的垂直交通工具。然而,电动车进入电梯并违规充电引发的火灾事故频发,对人民生命财产安全构成严重威胁。为解决这一问题,本系统基于YOLOv8深度学习算法…...

rk3576(5)之设备树下GPIO驱动

1、简介rk3576buildroot设备树GPIO驱动编写。个人理解设备树就相当于存在统一规则、统一管理的头文件,记录了开发板的设备信息。2、设备树语法2.1、dtsi 头文件设备树也支持头文件,设备树的头文件扩展名为.dtsi设备树文件不仅可以应用 C 语言里面的.h 头…...

OpenGL渲染与几何内核那点事-项目实践理论补充(二-1-(1):当你的CAD学会“想象”:图形技术与AI融合的三个层次)

TOC 代码仓库入口: github源码地址。gitee源码地址。 系列文章规划: (OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(1):从开发的视角看下CAD画出那些好看的图形们))OpenGL渲染与几何内核那点事-项…...