我需要做类似于这个问题中描述的任务:
Construct tree with pre-order traversal given
这里有一个非常有用的答案,但我不完全理解伪代码,所以我想知道是否有人可以帮我描述一下发生了什么。
k = 0 // Initialize
input = ... get preorder traversal vector from user ... // Get input
Reconstruct(T) // Reconstruct method with tree input
if input[k] == N // If element of input is N
T = new node with label N // Make a new node with label N in tree T
k = k + 1 // Increment k for next loop (Is this whole thing a loop? or a method call?)
Reconstruct(T.left) // ?????
Reconstruct(T.right) // ?????
else // If element of input is L
T = new node with label L // Make a new node with label L in tree T
T.left = T.right = null // ?????
k = k + 1 // Increment k for next loop
我已经在评论中写下了对事物的理解,如果有人能够检查我的理解是否正确,以及问号部分在做什么,我真的很感激。此外,只要在输入中遇到L,这个伪代码是通过运行输入和回溯来创建一个新树吗?还是重建现有的二叉树?
答案 0 :(得分:2)
没有循环。 k
是一个全局范围的变量,可以在Reconstruct(T)
内访问。它只是字符数组的当前索引(输入字符串)。
正如你引用的问题(Contsruct Tree with Pre-Order Traversal)中所解释的那样,正确的算法是做一个节点的左子,然后是右子,这是你在true
部分看到的if
的。{如果当前节点碰巧是叶子L
,那么不要给它子节点并返回调用函数。
此函数的作用是在树的左边缘,向所有N
节点添加子节点,而不是将子节点添加到所有L
节点(也称为叶子),直到字符串结束。
编辑:当伪代码的作者说T.left = T.right = null
时,这意味着此时,当前节点没有左或右子节点(因为它是叶子)。这只是一个断言,并不一定需要在代码中。