Recursion 从符号输入构造树

Recursion 从符号输入构造树,recursion,tree,scheme,Recursion,Tree,Scheme,我试图用scheme语言从字符串输入构建一棵树。以下是我尝试过的- (define travsal (lambda (tree) (cond ((null? tree) '()) (#t (append (travsal (car tree)) (cons (cadr tree) (travsal (caddr tree)))))))) (define tree1 '(((() 4 ()) 2 (() 5

我试图用scheme语言从字符串输入构建一棵树。以下是我尝试过的-

(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(()))””,然后像上面函数正在打印的那样打印出来

请帮忙,我在一次采访中被问到这个问题,但仍然无法解决。

你说“不做实际的二叉树应该做的事情”是什么意思。遍历代码很好,它正在对树进行一次遍历。修复一些格式问题:

(define travsal
  (lambda (tree)
    (cond ((null? tree) '())
          (else (append (travsal (car tree))
                        (cons (cadr tree)
                              (travsal (caddr tree))))))))
现在,请记住,您提供的树是二进制的,但没有排序:

如果我们画它,它会像这样:

       1
     /   \
   2       3
  /  \   /   \
4     5 6     7
在使用
travsal
过程时,按顺序遍历后,将正确生成此结果:

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

现在他们在面试中问一些计划问题?好极了这份工作在哪里,我可以申请吗PIf的前序或后序二叉树必须打印出来,比我还要从头开始写逻辑。相反,如果我可以先存储树并对其应用输出逻辑。或者这对我来说很好?我不明白你的意思。您想如何“打印”它?这是一个横向图,还是一个实际的图形。如果您想从(比如)pre-order切换到post-order-yes,您必须编写一个不同的过程(但很简单,只需将参数的顺序更改为
append
,在列表中添加根)。您使用的树表示法很好,无需将其存储在其他位置,您可以直接在其上应用输出逻辑。谢谢您,Oscar,这样就可以了。只需一个简单的问题-“解析文本字符串并在内部数据结构中构建树”,此时我感到困惑,因为我没有在代码中构建任何类型的二叉树,它只是使用用户的输入。就这方面而言,这是否足够?@BeingCoder这取决于你如何接收实际输入。如果它确实是一个字符串,那么您必须对其进行求值,并将其转换为类似于
tree1
的符号列表。如果输入已经是一个符号列表,那么这已经是我们需要的数据结构,列表可以用来表示树,如上图所示。
(travsal tree1)
=> '(4 2 5 1 6 3 7)