String 从递归定义的字符串表示法构建二叉树

String 从递归定义的字符串表示法构建二叉树,string,parsing,recursion,tree,binary-tree,String,Parsing,Recursion,Tree,Binary Tree,我已经为此挣扎了好几个小时了,所以在不停地谷歌搜索之后,我终于决定看看so能为我的最新CS硬件提供什么样的帮助 我们的任务是读入并存储二叉树,二叉树的格式如下: ((根)(左_子树)(右_子树)) 每一组匹配的paren表示一棵树,首先是根,其次是左子树,然后是右子树。如果子树是一片叶子,它不需要被叶子包围,但它可以被叶子包围。为了阐明我的意思,请参见以下示例,这些示例都是代码块下面所示树的有效表示形式 (A B C) (A (B) C) (A B (C)) ((A) (B) (C)) (来

我已经为此挣扎了好几个小时了,所以在不停地谷歌搜索之后,我终于决定看看so能为我的最新CS硬件提供什么样的帮助

我们的任务是读入并存储二叉树,二叉树的格式如下: ((根)(左_子树)(右_子树))

每一组匹配的paren表示一棵树,首先是根,其次是左子树,然后是右子树。如果子树是一片叶子,它不需要被叶子包围,但它可以被叶子包围。为了阐明我的意思,请参见以下示例,这些示例都是代码块下面所示树的有效表示形式

(A B C)
(A (B) C)
(A B (C))
((A) (B) (C))

(来源:)

对于一个更为复杂的示例,可以更好地说明定义的递归性质,以下树的一个可能字符串是:

(F(B A (D C E)) (G () (I (H))))
请注意,在F的右子树[即“(G()(i(H)))”]中,在G之后必须有“()”来表示空的左子树-但也请注意,G[“(i(H))”]的右子树也可以更简单地表示为“(i H)”

我已经完成了一个二叉树类(以及匹配的TreeNode类),除了从这个输入构建树的基本函数之外,但是我似乎无法理解如何准确地解析字符串。我对如何做有一个大致的想法——至少,递归是如何工作的——但如何准确地将问题分解成更小的部分一直困扰着我

//pseudocode musings
TreeNode* Tree::buildFromString(string s){
TreeNode* temp = NULL
if ( the string doesn't represent an empty tree )
  temp = new TreeNode
  temp->data = part of s representing root
  temp->leftChild = buildFromString( part of s representing left subtree)
  temp->rightChild = same as above, but with right subtree     
}
return temp;
我对递归本身并没有什么问题——这是有道理的,在你们的头脑中粗略地追踪它并不难。基本情况是有效的——您退出递归,在到达叶节点后返回调用,并在返回时链接子树

但我不知道如何在代码中将问题分解成更小的部分,这显然是递归的全部要点。我想创建原始的子字符串以传递给递归调用,但我似乎无法理解如何获得适当的片段


有什么想法吗?

你说得对,缺少的是:

  • 如果字符串以“(”开头,它将启动一棵树,“a”后面是根
  • 如果是,例如,“B”,那就是一片叶子
  • 如果是“(”,则递归
  • 如果“下一步”为“'),请关闭从上面开始的节点

这在英语中非常有意义,我当时也在想这一点,但我似乎不知道如何在代码中实现这一点。我在这里感到很沮丧-我觉得我离解决方案只有几英寸远,但我缺少的只是一些谜题-我如何从原始代码中获得子字符串以传递给其他人递归调用?