首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在球拍中将预定的通用树转换为post

在球拍中将预定的通用树转换为post
EN

Stack Overflow用户
提问于 2017-01-26 02:22:28
回答 1查看 264关注 0票数 2

我是新手,我读过很多网页上的信息,但我在实现一个通用树作为一个数字列表列表时遇到了困难。如果我从stdin接受以下预排序树输入:

代码语言:javascript
复制
1 3
2 2
5 0
6 0
3 1
7 0
4 4
8 0
9 0
10 0
11 1
12 0

其中,第一个数字表示该节点的值,而第二个值表示该节点的子节点数。在将预期结果转换为“后序”之前,我会尝试这样做:

代码语言:javascript
复制
'(1 (2 (5 6)) (3 ( 7)) (4 (8 9 10 11 (12))))

到目前为止,我有以下几点:

代码语言:javascript
复制
(define recurse 0)

(define (getTreeInfo)
  (local ((define line (read-line)))
    (if (eof-object? line)
        empty
        (if (= recurse 1)
            (makeTree (string->number(first (string-split line))) (- (string->number(second (string-split line))) 1))
            (makeTree (string->number(first (string-split line))) (string->number(second (string-split line))))))))

(define (makeTree value numChildren)
  (cond
    [(= numChildren 0) (begin (set! recurse 0)
                              (printf "Recurse: ~a\n" recurse)
                              (cons )]
    [else (begin (set! recurse 1)
                 (printf "Recurse: ~a\n" recurse)
                 (cons value (getTreeInfo)))]))

这段代码既不完整也不正确,但它是我思考过程的起点。有什么办法来接近这个穿越吗?我觉得这里需要相互递归。

EN

回答 1

Stack Overflow用户

发布于 2017-01-26 08:24:19

我对预期的结果不太清楚。除了节点1的子表之外,子列表中大部分都包含子列表,而且由于11是子树,所以我认为应该是(11 (12))。因此,在我看来,一个可能的结果可能类似于'(1 ((2 (5 6)) (3 (7)) (4 (8 9 10 (11 (12)))))),其中每个节点的子节点都在他们自己的列表中。

getTreeInfo函数的一个版本可以使用另一个参数来跟踪当前节点期望的更多子节点,并通过每个递归步骤使其递减。我没有使用太多的方案,所以我不确定这是惯用的,但这里有一个例子。

代码语言:javascript
复制
;; IN is input stream, N is number of children remaining for current node
(define (getTreeInfo in n)
  (if (zero? n) null                      ; no more children, return nil
      (let ([line (map string->number (string-split (read-line)))])
        (cond
         [(zero? (cadr line)) (list (car line))] ; node has no children
         [else
          (let ([children '()])
            (for ([_ (in-range (cadr line))])
              (set! children (append children (getTreeInfo in 1))))
            (cons (list (car line) children) (getTreeInfo in (sub1 n))))]))))

;; take input from stdin and start N at 1
(car (getTreeInfo (current-input-port) 1))

从命令行,

代码语言:javascript
复制
$ racket reorder.rkt < tree.txt
'(1 ((2 (5 6)) (3 (7)) (4 (8 9 10 (11 (12))))))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41864999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档