理解伪代码从前序遍历构造树

时间:2011-05-04 22:31:04

标签: binary-tree pseudocode

我需要做类似于这个问题中描述的任务:
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,这个伪代码是通过运行输入和回溯来创建一个新树吗?还是重建现有的二叉树?

1 个答案:

答案 0 :(得分:2)

没有循环。 k是一个全局范围的变量,可以在Reconstruct(T)内访问。它只是字符数组的当前索引(输入字符串)。

正如你引用的问题(Contsruct Tree with Pre-Order Traversal)中所解释的那样,正确的算法是做一个节点的左子,然后是右子,这是你在true部分看到的if的。{如果当前节点碰巧是叶子L,那么不要给它子节点并返回调用函数。

此函数的作用是在树的左边缘,向所有N节点添加子节点,而不是将子节点添加到所有L节点(也称为叶子),直到字符串结束。

编辑:当伪代码的作者说T.left = T.right = null时,这意味着此时,当前节点没有左或右子节点(因为它是叶子)。这只是一个断言,并不一定需要在代码中。