我现在已经在这几个小时里苦苦挣扎了,所以经过谷歌搜索不断发现,我终于决定看看我可能会在最新的CS hw上给我什么样的帮助。
我们的任务是读入和存储二进制树,这些树以这样的格式提供给我们: ((root)(left_subtree)(right_subtree))
每组匹配的parens代表一棵树,第一个是根,第二个是左子树,然后是右子树。如果它是一片叶子,子树不需要被parens包围,但它可以。为了澄清我的意思,请参阅以下示例,这些示例都是代码块下方所示树的有效表示。
(A B C)
(A (B) C)
(A B (C))
((A) (B) (C))
a tree http://faculty.otterbein.edu/psanderson/csc205/notes/binaryTreeABC.jpg
对于一个更复杂的例子,它更好地说明了定义的递归性质,以下树的一个可能的字符串是:
(F(B A (D C E)) (G () (I (H))))
请注意,在F的右子树中[即“(G()(I(H)))”],G之后的“()”是必要的,表示空的左子 - 但也要注意G的右子树[[(I(H))“]也可以更简单地表示为“(IH)”。
我有一个二叉树类(和匹配的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;
我对递归本身没有任何麻烦 - 这是有道理的,在你的头脑中粗略追踪它并不难。基本情况有效 - 一旦到达叶节点,就会退出递归并返回调用,并在返回时链接子树。
但我无法弄清楚如何将问题分解为代码中的较小部分,这显然是递归的全部要点。我想创建原始的子串以传递给递归调用,但我似乎无法绕过如何获得适当的部分。
有什么想法吗?
答案 0 :(得分:1)
你是对的,缺少的是: