【问题标题】:Constructing tree from symbolic input从符号输入构造树
【发布时间】:2014-08-29 19:26:30
【问题描述】:

我正在尝试从字符串输入中用方案语言构造一棵树。以下是我尝试过的 -

(define travsal (lambda (tree)
             (cond
               ((null? tree) '())
               (#t (append (travsal (car tree)) (cons (cadr tree)
(travsal (caddr tree))))))))

 (define tree1 '(((() 4 ()) 2 (() 5 ())) 1 ((() 6 ()) 3 (() 7 ()))))

  (display tree1)
  (newline)

  (travsal tree1)

正如您所看到的,它只是迭代提供的输入,而不是执行实际二叉树应该执行的操作。 我对如何使用符号输入中的节点和子节点保存树的逻辑感到震惊 - “(((()4())2(()5()))1((()6()) 3 (() 7 ()))))" 然后像上面的函数打印一样打印出来。

请帮忙,我在面试中被问到这个问题,仍然无法解决。

【问题讨论】:

  • 现在他们在面试中问 Scheme 问题?极好的!这份工作在哪里,我可以申请吗? :P

标签: recursion tree scheme


【解决方案1】:

“不做实际二叉树应该做的事情”是什么意思? .遍历代码很好,它正在执行树的in-order traversal。修复一些格式问题:

(define travsal
  (lambda (tree)
    (cond ((null? tree) '())
          (else (append (travsal (car tree))
                        (cons (cadr tree)
                              (travsal (caddr tree))))))))

现在,请记住,您提供的树是二元的,但没有排序:

(define tree1 '(((() 4 ()) 2 (() 5 ())) 1 ((() 6 ()) 3 (() 7 ()))))

如果我们绘制它,它会是这样的:

       1
     /   \
   2       3
  /  \   /   \
4     5 6     7

其中,在使用travsal 过程时,按顺序遍历将正确产生此结果:

(travsal tree1)
=> '(4 2 5 1 6 3 7)

【讨论】:

  • 如果必须打印前序或后序二叉树,那么我再次必须从头开始编写逻辑。相反,如果我可以先存储树并在其上应用输出逻辑。或者这会很好吗?
  • 我不关注你。你想如何“打印”它?是遍历还是实际绘图? .如果你想从预购切换到后购,是的,你必须编写一个不同的程序(但这很简单,只需将参数的顺序更改为append,在列表中添加根)。您使用的树表示很好,无需将其存储在其他地方,您可以直接在其上应用输出逻辑。
  • 谢谢你,奥斯卡,就可以了。
  • 只是一个简单的问题 - “解析文本字符串并在内部数据结构中构建树”,此时我感到困惑,因为我没有在我的代码中构建任何类型的二叉树,它只是使用用户的输入。就这方面而言,这是否足够?
  • @BeingCoder 这取决于您如何接收实际输入。如果它真的是一个字符串,那么你必须评估它并将它转换成一个看起来像tree1 的符号列表。如果输入已经是一个符号列表,那么这已经是我们需要的数据结构,一个列表可以用来表示一棵树,如上所示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多