String 从递归定义的字符串表示法构建二叉树
我已经为此挣扎了好几个小时了,所以在不停地谷歌搜索之后,我终于决定看看so能为我的最新CS硬件提供什么样的帮助 我们的任务是读入并存储二叉树,二叉树的格式如下: ((根)(左_子树)(右_子树)) 每一组匹配的paren表示一棵树,首先是根,其次是左子树,然后是右子树。如果子树是一片叶子,它不需要被叶子包围,但它可以被叶子包围。为了阐明我的意思,请参见以下示例,这些示例都是代码块下面所示树的有效表示形式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)) (来
(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”,那就是一片叶子
- 如果是“(”,则递归
- 如果“下一步”为“'),请关闭从上面开始的节点