基于广义表二叉树字符串递归生成二叉树,各种递归非递归遍历二叉树,查找二叉树操作,求二叉树高度,深度,结点度数,叶子结点度数集合_广义表生成二叉树递归法-程序员宅基地

技术标签: C++  

基本思路都在代码注释里

#include <string>
#include <iostream>
#include <algorithm>
#include <stack>

using namespace std;

struct treeNode {
   
    
    string data;

    treeNode *leftChild{
   
    };
    treeNode *rightChild{
   
    };

    int leftTag;
    int rightTag;
};

//返回的是中点逗号的位置
//1.当inputData为“C(D,E),F”时,返回“6”,
//2.当inputData为“C,D”时,返回“1”
//3.当inputData为“,A(B,C)”时,返回“0”
//4.当inputData为“C(D,E)”时,返回“-1”
int findMiddlePosition(string inputData) {
   
    
    int result = -1;

    int leftK = 0;
    int rightK = 0;
    int position = 0;
    while (inputData[position]) {
   
    
        if (inputData[position] == '(') {
   
    
            ++leftK;
        } else if (inputData[position] == ')') {
   
    
            ++rightK;
        } else if (leftK == rightK && inputData[position] == ',') {
   
    
            result = position;
            break;
        }
        ++position;
    }

    return result;
}

//提取出数据
//1.当left为true时,提取的是左边的值
//  1.当inputData为“C(D,E),F”时,返回“C(D,E)”,
//  2.当inputData为“,A(B,C)”时,返回空字符串
//  3.当inputData为“C(D,E)”时,返回“C(D,E)”

//2.当left为false时,提取的是右边的值
//  1.当inputData为“C(D,E),F”时,返回“F”
//  2.当inputData为“C(D,E)”时,返回空字符串
string getString(const string &inputData, bool left) {
   
    
    string result;

    int middlePosition = findMiddlePosition(inputData);
    if (left) {
   
    
        if (middlePosition == -1) {
   
    
            result = inputData;
        } else if (middlePosition != 0) {
   
    
            result = inputData.substr(0, middlePosition);
        }
    } else {
   
    
        if (middlePosition != -1) {
   
    
            result = inputData.substr(middlePosition + 1, inputData.length() - middlePosition - 1);
        }
    }

    return result;
}

//对字符串进行处理
//inputData会有两种输入情况
//  1.输入的只是一个字符,此时直接返回空字符串
//  2.输入的是一个形如A(B(C,D),E)的形式,去掉第一,第二,最后一个字符,将返回B(C,D),E字符串
string eraseString(const string &inputData) {
   
    
    string result;

    if (inputData.length() != 1) {
   
    
        result = inputData.substr(2, inputData.length() - 2 - 1);
    }

    return result;
}

//返回第一个字符
string getData(const string &inputData) {
   
    
    return inputData.substr(0, 1);
}

//函数返回的是根节点
treeNode *buildTree(const string &inputData) {
   
    
    auto *node = new treeNode;
    node->data = getData(inputData);

    string newInputData = eraseString(inputData);

    
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/vancece/article/details/103356968

智能推荐

JUC学习(五):ArrayList的线程安全问题分析与解决方案(vector、Collections、写时复制技术)_arraylist和vector的线程安全-程序员宅基地

文章浏览阅读5.2k次。目录一、异常演示二、解决方案 1、vector 2、Collections工具类 3、CopyOnWriteArrayList 写时复制技术三、写时复制技术 1、特性 2、原理一、异常演示循环创建线程,将数据放入集合的同时,从集合中读取数据。/** * list集合线程不安全问题 */public class ThreadDemo04 {......_arraylist和vector的线程安全

Typo: In word 'xxx' less... (Ctrl+F1) 去掉错误拼写检查提示_typo: in word 'bookindex' less... (ctrl+f1) inspec-程序员宅基地

文章浏览阅读7.4k次。解决步骤:File -> SettingsEditor -> Code Style -> inspections -> Spelling -Typo 把勾选状态去掉,点击 OK即可_typo: in word 'bookindex' less... (ctrl+f1) inspection info: spellchecker in

谷歌浏览器设置打开链接在新标签页打开(打开网页时不覆盖原网页)_谷歌浏览器打开新网页在新窗口打开-程序员宅基地

文章浏览阅读1.1k次。1、登录自己的谷歌账户,随便搜索一个内容(如果没有账户,估计也在右上角有齿轮的地方,请找一下),选中更多设置。2、其他设置,选择“在新窗口中打开搜索结果”_谷歌浏览器打开新网页在新窗口打开

操作系统中典型的调度算法_非剥夺式优先级调度算法-程序员宅基地

文章浏览阅读2.6k次。操作系统 调度算法_非剥夺式优先级调度算法

vue中 同步,异步获取后台数据并在另外的方法中调用该数据_vue中success的结果传出-程序员宅基地

文章浏览阅读1.2k次。【代码】vue中 同步,异步获取后台数据并在另外的方法中调用该数据。_vue中success的结果传出

Web入门之VScode连接数据库sql server(超详细)_vscode连接sql server-程序员宅基地

文章浏览阅读2.5w次,点赞53次,收藏292次。Web入门之VScode连接数据库sql server(超详细)今天我们终于开始连接数据库啦,作为一个登录页面,怎么能不连接我们已经建立好的school数据库呢,下面,我们一起来连接吧,非常简单哦。打开数据库第一步当然就是打开我们的数据库啦,以前我们可能常常使用本机地址一键登录,不过这次我们需要使用密码登录喽。身份验证这里我们选择SQL Server 身份验证,登录名一般默认都是sa,输入密码,密码我们之前设好过,如果忘记也没关系,是可以修改的,如果忘记的话,之后我会写一篇文章,介绍如何修改密码。_vscode连接sql server

随便推点

java中间件 - redis其他问题_master最好不要做任何持久化工作-程序员宅基地

文章浏览阅读1.1k次。Redis常见性能问题和解决方案?Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。尽量避免在压力较大的主库上增加从库Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。为了Master的稳定性,主_master最好不要做任何持久化工作

美赛备赛资料大全_美赛资料-程序员宅基地

文章浏览阅读4.2w次,点赞246次,收藏2.1k次。目录1、美赛比赛网址及其介绍2、美赛摘要页说明3、美赛常用词语与语句4、美赛翻译注意事项5、美赛论文写作一些建议5.1 团队方面准备5.2 摘要表部分5.3 评委关注点6、组队要求7、软件与一些建模网址参考(1)写一篇建模文章大致需要如下技能:(2)数学建模算法总结(3) word小白教程数据资料:(4)1982—2018中国统计年鉴大全链接(5)美国人口普查数据大全链接(6)美国城市数据大全链接(7)全球统计数..._美赛资料

Flutter 网络请求的三种简单实现-程序员宅基地

文章浏览阅读285次。概述:本文主要讲解了flutter网络请求三种方式 flutter自带的HttpClient、 第三方库http 和 第三方库Dio 的简单实现 GET 和 POST请求,本文是笔者学习Flutter网络模块知识总结,若有问题还望不腻赐教。一.系统自带HttpClient1.使用中温馨提示1.1.导入库import 'dart:io'; // 网络请求import 'dart:co..._flutter http.client和httpclient

【MATLAB】滞后校正装置的设计_滞后校正设计-程序员宅基地

文章浏览阅读2.2k次,点赞10次,收藏42次。滞后校正的实质是利用滞后网络幅值衰减特性,将系统的中频段压低,使校正后系统的截止频率减小,挖掘系统自身的相角储备来满足校正后系统的相角裕度要求_滞后校正设计

多账号自媒体工具,多平台同时发布_多ip 多账号 多平台 文章自动发布 开源-程序员宅基地

文章浏览阅读699次。现在使用自媒体工具进行头条号内容发布的自媒体人有很多,尤其是头条号作为自媒体主流平台,在各大平台里,所占的人数也具有一定的数量,很多人不是只运营头条号一个平台,其他的平台也有在运营。由于平台账号的增加,大多数人在内容分发上面花费的时间越来越多,这个时候大家就可以用到蚁小二自媒体工具,5分钟就可以把内容发布到多个平台,还能批量导入上百个账号,检测文章原创度。同时在给大家分享几个我们在自媒体运营中需要用到的小工具。1.找素材工具关于素材方面的工具,大家应该也见过很多,像易撰素材采集工具这.._多ip 多账号 多平台 文章自动发布 开源

分布式文件存储系统minio、大文件分片传输_miniio 分片写入文件-程序员宅基地

文章浏览阅读991次。MD5计算将整个文件或者字符串,通过其不可逆的字符串变换计算,产生文件或字符串的MD5散列值。如果传入的是一个负数,那么这个偏移量将会从数据的末尾从后到前开始计算。因为如果文件、字符串的MD5散列值不一样,说明文件内容也是不一样的。包含了一套完整的事件模型,用于捕获读取文件时的状态,下面这个表格归纳了这些事件。通过slice方法,从blob1中创建出一个新的blob对象,size等于3。的一个下标,这个下标-1的对应的字节将会是被拷贝进新的。,其中 3 个用以读取文件,另一个用来中断读取。_miniio 分片写入文件

推荐文章

热门文章

相关标签