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

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将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

python中字符串拼接的几种方法及优缺点对比详解

《python中字符串拼接的几种方法及优缺点对比详解》在Python中,字符串拼接是常见的操作,Python提供了多种方法来拼接字符串,每种方法有其优缺点和适用场景,以下是几种常见的字符串拼接方法,需... 目录1. 使用 + 运算符示例:优缺点:2. 使用&nbsjsp;join() 方法示例:优缺点:3

java字符串数字补齐位数详解

《java字符串数字补齐位数详解》:本文主要介绍java字符串数字补齐位数,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java字符串数字补齐位数一、使用String.format()方法二、Apache Commons Lang库方法三、Java 11+的St