热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

二叉树的链表实现

本文介绍了一种使用链表结构表示二叉树的方法。通过定义节点结构和相关操作函数,可以方便地创建、插入和遍历二叉树。

在计算机科学中,二叉树是一种常见的数据结构。为了便于管理和操作,我们可以通过链表的方式来表示二叉树。以下是具体的实现方法:

首先,定义一个二叉树节点的结构体:

#include 
using namespace std;

struct TreeNode {
int data;
TreeNode* left;
TreeNode* right;
};

接下来,定义一些辅助类型以简化后续代码:

typedef struct TreeNode TreeNode;
typedef TreeNode* BTree;

为了向二叉树中插入新节点,我们可以编写如下函数:

BTree insertNode(BTree root, int value) {
BTree newNode = new TreeNode();
newNode->data = value;
newNode->left = nullptr;
newNode->right = nullptr;

if (root == nullptr) {
return newNode;
}

BTree current = root;
BTree parent = nullptr;

while (current != nullptr) {
parent = current;
if (current->data > value) {
current = current->left;
} else {
current = current->right;
}
}

if (parent->data > value) {
parent->left = newNode;
} else {
parent->right = newNode;
}

return root;
}

有了插入函数后,我们可以轻松地创建一棵二叉树:

BTree createBTree(int* data, int len) {
BTree root = nullptr;
for (int i = 0; i root = insertNode(root, data[i]);
}
return root;
}

最后,我们还需要一个函数来遍历并输出二叉树的内容:

void printBTree(BTree root) {
if (root == nullptr) {
cout <<"树为空" < return;
}

cout <<"左子树内容:\n";
BTree ptr = root->left;
while (ptr != nullptr) {
cout <<"[" <data <<"]\n";
ptr = ptr->left;
}

cout <<"右子树内容:\n";
ptr = root->right;
while (ptr != nullptr) {
cout <<"[" <data <<"]\n";
ptr = ptr->right;
}
}

以下是一个完整的示例程序:

int main() {
BTree root = nullptr;
int data[] = {5, 6, 4, 8, 2, 3, 7, 1, 9};
root = createBTree(data, 9);

cout <<"树的结点内容:\n";
printBTree(root);

return 0;
}

推荐阅读
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 本文介绍了一种基于选择排序思想的高效排序方法——堆排序。通过使用堆数据结构,堆排序能够在每次查找最大元素时显著提高效率。文章详细描述了堆排序的工作原理,并提供了完整的C语言代码实现。 ... [详细]
  • HDU 2871 内存管理问题(线段树优化)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871。本题涉及内存管理操作,包括重置、申请、释放和查询内存块。通过使用线段树进行高效管理和维护。 ... [详细]
  • KMP算法是处理字符串匹配的一种高效算法它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配。从渐进的意义上说,这样时间复 ... [详细]
  • 本文介绍了一个经典的算法问题——活动选择问题,来源于牛客网的比赛题目。该问题要求从一系列活动集合中选出最多数量的相容活动,确保这些活动的时间段不重叠。 ... [详细]
  • 本题要求计算给定两个正整数a和b时,2的-a次方与2的-b次方之和,并将结果以最简分数形式表示。输入包括多组测试数据,每组数据包含两个在2到20范围内的整数。 ... [详细]
  • 本文介绍了一道来自《紫书》的编程题目——UVa11212 编辑书稿。该问题通过迭代加深搜索(IDA*)算法解决,旨在找到将给定排列转换为升序排列所需的最少步骤。文章提供了详细的解题思路和代码实现。 ... [详细]
  • 本文深入探讨了 Java 中 LocalTime 类的 isSupported() 方法,包括其功能、语法和使用示例。通过具体的代码片段,帮助读者理解如何检查特定的时间字段或单位是否被 LocalTime 类支持。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 本文探讨了在 SQL Server 中使用 JDBC 插入数据时遇到的问题。通过详细分析代码和数据库配置,提供了解决方案并解释了潜在的原因。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • 本文详细介绍了Java集合框架中的Collection体系,包括集合的基本概念及其与数组的区别。同时,深入探讨了Comparable和Comparator接口的区别,并分析了各种集合类的底层数据结构。最后,提供了如何根据需求选择合适的集合类的指导。 ... [详细]
  • BFS深搜hashtable来判断是横线还是竖线但是为啥还是90分啊呜呜!找不到原因#define_CRT_SECURE_NO_WARNINGS1#include ... [详细]
  • 详解 | 日志系统ViseLog的基本使用与功能
    本文详细介绍了日志系统ViseLog的使用方法及其核心功能,旨在帮助开发者更好地理解和利用这一工具,提高开发效率。 ... [详细]
author-avatar
铲除飞网败类
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有