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

这篇博客详细介绍了如何利用广义表字符串递归生成二叉树,并探讨了各种递归和非递归遍历二叉树的方法。同时,文章还涉及二叉树的操作,如查找、计算树的高度、深度、节点度数以及叶子节点度数集合。代码注释清晰,便于理解。
摘要由CSDN通过智能技术生成

基本思路都在代码注释里

#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);

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值