使用对象(值类型)和使用指针表示左右子树,区别和联系比较

news/2025/3/20 14:28:45/文章来源:https://www.cnblogs.com/kkman2000/p/18782966

区别

1. 内存分配方式

  • 使用对象(值类型):每个节点的左右子树是直接嵌入在该节点对象内部的。也就是说,当创建一个节点对象时,其左右子树所需的内存空间会随着节点对象的创建而一并分配,它们在内存中是连续存储的。
  • 使用指针:节点结构体中存储的是左右子树节点的地址(指针)。左右子树节点的内存需要单独进行动态分配(例如使用new操作符),这些节点可以在内存的不同位置,它们通过指针相互关联。

2. 表示空节点的方式

  • 使用对象(值类型):较难清晰地表示空节点。因为值类型成员必须有一个实际的对象实例,通常需要额外的标记或特定的值来表示该子树为空,这会增加代码的复杂性和理解难度。
  • 使用指针:可以很方便地用nullptr来表示某个子树为空,这是一种直观且通用的表示方式。

3. 节点关系的灵活性

  • 使用对象(值类型):节点之间的关系在创建时就基本固定,很难动态地改变节点的子树结构。因为子树是节点对象的一部分,若要改变子树,可能需要重新创建整个节点对象。
  • 使用指针:可以非常灵活地改变节点之间的关系。只需要修改指针的值,就可以轻松地添加、删除子节点,或者改变子树的指向。

优缺点

使用对象(值类型)表示左右子树

优点
  • 内存管理简单:无需手动管理子树节点的内存分配和释放,因为它们的生命周期与父节点一致,由系统自动处理,减少了因内存管理不当导致的错误(如内存泄漏、悬空指针)。
  • 访问快速:由于子树节点与父节点在内存中连续存储,访问子树节点的成员时,不需要额外的指针解引用操作,直接通过成员访问运算符.即可,访问速度较快。
缺点
  • 灵活性差:难以动态地调整树的结构,如添加或删除节点。如果要改变子树,往往需要重新创建包含新子树的节点对象。
  • 内存浪费:即使某个子树为空,也会为其分配固定大小的内存空间,造成内存的浪费。尤其是在树结构较为稀疏的情况下,这种浪费会更加明显。

使用指针表示左右子树

优点
  • 灵活性高:能够方便地动态创建、删除节点,调整树的结构。可以在运行时根据需要灵活地改变节点之间的父子关系,适应不同的应用场景。
  • 内存利用高效:只有在实际需要时才为子树节点分配内存,避免了不必要的内存浪费。对于大规模的树结构,这种方式可以显著节省内存。
缺点
  • 内存管理复杂:需要手动进行内存的分配(使用new)和释放(使用delete),如果处理不当,容易出现内存泄漏、悬空指针等问题,增加了程序的出错风险。
  • 访问开销:访问子树节点的成员时,需要先进行指针解引用操作(使用->),这会带来一定的性能开销,尤其是在频繁访问节点的情况下。

下面是分别使用值类型和指针表示左右子树的简单示例代码,帮助你进一步理解:

#include <iostream>// 使用对象(值类型)表示左右子树
struct TreeNodeValueType {int val;TreeNodeValueType left;TreeNodeValueType right;TreeNodeValueType(int x) : val(x), left(0), right(0) {}
};// 使用指针表示左右子树
struct TreeNodePointerType {int val;TreeNodePointerType* left;TreeNodePointerType* right;TreeNodePointerType(int x) : val(x), left(nullptr), right(nullptr) {}
};int main() {// 使用值类型创建节点会有诸多不便,这里仅示意// TreeNodeValueType node1(1);// 使用指针创建节点TreeNodePointerType* node2 = new TreeNodePointerType(2);node2->left = new TreeNodePointerType(3);node2->right = new TreeNodePointerType(4);// 释放内存delete node2->left;delete node2->right;delete node2;return 0;
}

在实际应用中,使用指针表示左右子树更为常见,因为它能更好地满足树结构动态变化的需求,尽管需要更谨慎地处理内存管理。

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

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

相关文章

Deepseek本地部署的webui可视化

1.WebUI可视化插件 —— Page Assist 在chrome应用商店中搜索Page Assist,找到后添加到chrome 浏览器添加完成后类似这样 点击这个扩展插件,即可看到 就可以进行对话聊天了

母婴电商企业案例:日事清驱动项目管理执行与OKR目标管理的流程自动化实践

日事清以电商基因与高性价比集成方案,助力科木电商解决协作低效、流程散乱等管理痛点,实现母婴品牌“小鹿豆豆”的团队提效与目标追踪。一、关于科木电商“小鹿豆豆”,一个年轻的品牌,近期在无论是淘宝、拼多多还是抖音电商平台,都成了亮眼的爆品。这个由绵阳科木电子商务…

20241905 2024-2025-2 《网络攻防实践》 第4次作业

1. 实验内容 在网络攻防实验环境中完成TCP/IP协议栈重点协议的攻击实验,包括ARP缓存欺骗攻击、ICMP重定向攻击、SYN Flood攻击、TCP RST攻击、TCP会话劫持攻击。 ARP缓存欺骗攻击:ARP协议在进行IP到MAC地址映射查询时存在安全缺陷,ARP协议为提高效率,设置了缓存机制,会将主…

ClkLog埋点系统客户案例-电子签佼佼者「大家签」为何选择ClkLog?

ClkLog的付费版上线已有一年多。作为一款从开源起步的产品,我们始终关注用户的使用体验。因此,近期我们发起了一轮客户回访,希望了解他们的使用情况及优化建议,并分享一些典型案例,让更多人看到ClkLog在真实业务场景中的价值。本次回访的客户是ClkLog最早的一批付费用户—…

国思RDIF低代码快速开发框架 v6.2版本发布

国思RDIF企业级低代码开发平台,给用户和开发者最佳的框架平台方案,为企业快速构建跨平台、企业级的应用提供强大支持。致力于解决企业信息化项目交付难、实施效率低、开发成本高的问题。能帮助企业快速构建美观易用、架构专业、安全可控的企业级多终端应用,并可随需而变。1、…

如何用Leangoo破解需求隔离与频繁变更的协作困局?

本文探讨了敏捷工具在团队需求管理中的优缺点。四款主流敏捷工具有各自的特点和适用场景,适用于不同的团队和需求。领歌更加适合国内的中小团队快速迭代需求。作为一位经历过“需求文档满天飞、系统各自为战”的研发负责人,我深知团队在需求频繁变更时面临的痛点——信息割裂…

数字先锋 | 如何提升工业园区算力服务,天翼云息壤给出答案!

AI时代,算力作为数字化转型的关键生产力,重要性不言而喻。在城市发展中,一个城市的算力应用水平,直接决定了它在数字经济赛道的发展潜力。因此,加快建设算力产业、推动算力互联互通,成为我国各城市驱动经济社会快速发展的重要抓手。 在苏州市工业园区(以下简称“工业园区…

WPF 和 Avalonia 开发者的 html css 前端指南 Grid 篇

本文主要面向WPF和Avalonia熟手但是对前端不太擅长的.NET开发者,希望能够向各位介绍WPF和Avalonia的写法如何在前端中实现。并且得出了在 Grid 控件上,html 和 css 的支持性可以很完美的描述原本的 WPF 和 Avalonia Grid。WPF 和 Avalonia 开发者的 html css 前端指南 Grid 篇…

20244220 实验一《Python程序设计》实验报告

实验一 (一)实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习变量和类型、字符串、对象、缩进和注释等;编写一个猜数字的游戏。(二)实验要求 熟悉Pycharm等开发环境; 掌握基本的Python运行和调试技能; 掌握基本的Python编程技能。 (…

74.8K star!这个开源图标库让界面设计效率提升10倍!

Font Awesome 是全球最受欢迎的图标库和工具包,提供超过2000个免费图标和7000+专业图标,支持网页、桌面应用、移动端等多平台使用。开发者只需几行代码就能为项目添加精美矢量图标,设计师可直接下载SVG进行二次创作。嗨,大家好,我是小华同学,关注我们获得“最新、最全、最…

如何在Java程序中使用泛型

如何在Java程序中使用泛型泛型可以使你的代码更灵活、更易读,并能帮助你在运行时避免ClassCastExceptions。让我们通过这篇结合Java集合框架的泛型入门指南,开启你的泛型之旅。Java 5引入的泛型增强了代码的类型安全性并提升了可读性。它能帮助你避免诸如ClassCastException(…

BUUCTF从0到1:N1BOOk(web入门,常见的信息收集)

各位师傅们,第一次写博客文章: 就从最简单的web信息收集入门吧: 信息收集在不管时在红蓝对抗还是在ctf比赛中都是具有很大的作用 我们先看题:题目提示:信息收集,我们就直接打开虚拟机kali用dirsearch命令扫描网址: 对于新手来说dirsearch还未安装,dirsearch安装看这个:…