树的括号表示法

本文介绍了如何使用括号表示法和递归方法在C++中构建树结构,包括定义Node类、CreateTree函数以及递归函数CreateTree1,通过实例展示了如何解析字符串并生成对应树形结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.括号表示法构造一棵树

下面的代码都使用下面的图测试:
在这里插入图片描述

这颗树的前序遍历是

  • [A,B,D,G,C,E,F,H]

为了程序的完整性,我想先构建一颗上述树,知识匮乏的我只能使用括号表示法构造:

  • “A(B(,D(G,)),C(E,F(H,)))”

1.用一个类表示树的节点

class Node 
{
   
public:
    int val;
    vector<Node*> children;   //每个Node节点包含一个children数组,数组元素是Node*类型,表示指向其它的节点

    //三个构造函数
    Node() {
   } 
    Node(int _val) 
    {
   
        val = _val;
    }
    Node(int _val, vector<Node*> _children) 
    {
   
        val = _val;
        children = _children;
    }
};

2.使用括号表示法构建树

void CreateTree(Node *&root,string &s)
{
   
    stack<Node*>tree;
    Node* p = NULL;
    int i =0;
    char ch = s[0];
    while (i < s.length())
    {
   
        switch (ch)
        {
   
        case '(':
            tree.push(p);
            break;
        case ')':
            tree.pop();
            break;
        case ',':
            break;
        default:
            p = new Node();
            p->val = ch;

            if (root == NULL)  //没有加入根节点
            {
   
                root = p;
            }
            else
            {
   
                tree.top()->children.push_back(p);
            }
        }
        ch = s[++i];
    }
}

我觉得这个代码逻辑非常清晰,我想尝试一下用递归的方式完成上述代码。在此之前,我先介绍一下我现在对于构建二叉树的理解,我感觉这个难度不亚于用非递归写出树的前中后序遍历😋

个人见解:
对于S字符串分析,S=A(B(,D(G,)),C(E,F(H,)))。从头开始遍历,想要通过S字符串构建一颗树。
想要将问题给解决,必须找到字符串内在的联系并且将其具体化。发现,所有的括号都是配对出现的,且’(‘其配对的是最近的’)’。每次当遇到’(‘的时候,可以把新的问题具体成”构建一棵小树“(发现和最开始的问题是一个内在逻辑)。然后小树挂在大树身上
解释一下:
最开始的问题是构建A(B(,D(G,)),C(E,F(H,))) 这棵树。
遍历到B后面的’(‘的时候,问题变成构建B(,D(G,)),C(E,F(H,))这棵树,然后B挂在A身上
遍历到D后面的’(‘的时候,问题变成构建D(G,)这颗树。然后D挂在B身上
发现了实际上就是解决无数个这样的小问题最后解决大问题,而进入小问题的接口就是遇到’('。所以只需要能解决最简单的A(B,C)这个问题,那么后面无限的衍生都是一个道理。
问题即抽象为:
A ( B , C , D , E . . . . ) A(B,C,D,E....) A(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值