将字符串的内容转换为一棵二叉树

2024-06-18 23:58

本文主要是介绍将字符串的内容转换为一棵二叉树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题:从控制台中输入一串“A(B(C,D(,E)),F(G,H(M,N(,Q))))“,将其转化建立一棵二叉树。
从这个问题我们可以知道,首先我们需要将这个字符串所表示的二叉树用代码的方式建立起来。我们先来看看这个字符串所表示的二叉树:
在这里插入图片描述
下面我们开始分析这个二叉树建立的思路:
(1)读取第一个字符建立第一个节点即为根节点;
(2)继续读取下一个字符,如果遇到“(”,那么当前节点为父节点,并且下一个节点为左孩子(左节点);如果遇到“,”那么下一个节点即为右孩子(右节点);
我们可以借助一个栈来存放所有的父节点(即为有左孩子或者右孩子的节点),依次来构建我们的二叉树,下面给出我们的具体的实现代码:
这里的节点类是一个类的模板,适合存取基本的数据类型或者我们自定义的类型,也就是所有的类型都可以存储,这是为了实现节点存储的通用性:

#pragma once
template<class T>
class BNode
{
public:BNode();BNode(T t);~BNode();public:/*左孩子*/BNode<T> *leftChild;/*右孩子*/BNode<T> *rightChild;/*j节点的值*/T t;};template<class T>
inline BNode<T>::BNode()
{
}template<class T>
inline BNode<T>::BNode(T t)
{this->t = t;
}template<class T>
inline BNode<T>::~BNode()
{
}

当然,如果你想简单点的实现的话,可以直接就定义个结构体:

struct LNode
{char  value;LNode* rightChild;LNode* leftChild;
};

这样也是可以的,这样比较简单。解决该问题我们就选择简单的实现吧,就使用

```cpp
struct TNode
{//节点的值char  value;//指向左孩子的指针TNode* rightChild;//指向右孩子的指针TNode* leftChild;
};

下面是开始建立二叉树并返回二叉树的根节点:

//根据嵌套括号表示法的字符串生成链式存储的二叉树
TNode*  CreateTreeNode(const char* str)
{char ch;Stack<TNode*> *stack = new Stack<TNode*>();TNode* root = NULL;TNode  *p = NULL;int  k, j = 0;  //k决定谁是左、右孩子、j为str指针while ((ch = str[j++]) != '\0'){switch (ch){case '(':stack->push(p);           //根节点入栈 k = 1;                    //1为左孩子 break;case ',':k = 2;                   //2为右孩子 break;case ')':stack->pop();                  //父节点出栈 break;default://创建一个节点p = new TNode();//给节点赋值p->value = ch;if (root == NULL)        //树为空时 {root = p;}else                   //树非空时 {switch (k){case 1:stack->getTop()->leftChild = p;           //父节点的左孩子 break;case 2:stack->getTop()->rightChild = p;          //父节点的右孩子 break;}}break;}}return root;
}

为了便于理解,下面我会用图解的方式来展示二叉树的建立过程:
第一步相当于:
在这里插入图片描述
第二步:
遇到“(”,则父节点入栈,此时p仍是为指向A的这个节点,而k更新为 k=1;
在这里插入图片描述
第三步:
在这里插入图片描述
此时节点A的左节点为B,k=1;
第四步:
)
此时p指向B节点,k=1,B节点入栈;
第五步:
在这里插入图片描述
此时p指向C节点,k=1;
第六步:
在这里插入图片描述
此时p指向c节点,k=2;
第七步:
在这里插入图片描述
此时p指向D节点,k=2;
第八步:
在这里插入图片描述
此时p指向D节点,k=1,父节点D入栈;
第九步:
在这里插入图片描述
此时p指向D节点,k = 2;
第十步:
在这里插入图片描述
此时p指向E节点,k = 2;
第十一步:
在这里插入图片描述
此时p指向E节点,k = 2,栈弹出节点D元素;
第十二步:
在这里插入图片描述
此时p指向E节点,k = 2,栈弹出节点B元素;
第十三步:
在这里插入图片描述
此时p指向E节点,k = 2,栈弹出节点B元素;
之后重复以上步骤一直到结束。。。。。。
最终的p ==NULL 和stack栈为空;
到此,我们就建好了一棵二叉树,下面为了检验,我们开始进行调试,笔者这里采用了代码简单的前序遍历递归的方式:


```cpp
void PrintTree(TNode* root)
{if (root == NULL){return;}cout << root->value;PrintTree(root->leftChild);PrintTree(root->rightChild);}

下面是main函数的执行:```cpp
int main()
{const char* p = "A(B(C,D(,E)),F(G,H(M,N(,Q))))";PrintTree(CreateTreeNode(p));system("pause");return 0;
}

输出为:
在这里插入图片描述
至此结束!!!!!

这篇关于将字符串的内容转换为一棵二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073430

相关文章

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

Java轻松实现PDF转换为PDF/A的示例代码

《Java轻松实现PDF转换为PDF/A的示例代码》本文将深入探讨Java环境下,如何利用专业工具将PDF转换为PDF/A格式,为数字文档的永续保存提供可靠方案,文中的示例代码讲解详细,感兴趣的小伙伴... 目录为什么需要将PDF转换为PDF/A使用Spire.PDF for Java进行转换前的准备通过

Python进行word模板内容替换的实现示例

《Python进行word模板内容替换的实现示例》本文介绍了使用Python自动化处理Word模板文档的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录技术背景与需求场景核心工具库介绍1.获取你的word模板内容2.正常文本内容的替换3.表格内容的

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定