UVa#112树求和

时间:2010-03-13 03:29:47

标签: tree lisp

我正在研究UVa #112 Tree Summing。我认为应该是一个有效的解决方案,但由于我对问题的基本误解,它不被在线评委接受。请考虑以下输入:

-1 (-1()())
77 (77(1()())())

或图解说,树看起来像:

  -1              77
 /   \           /  \
()    ()        1    ()
               / \
              ()  ()

根据至少两种工作方案,上述输入的正确输出为:

yes
no

然而,我不明白为什么第二个应该是'不'。在我看来,树的最右边的路径应该给出适当的总和。我错过了什么?

1 个答案:

答案 0 :(得分:3)

易。

树:

(77(1()())())

叶子的形式如下:(integer()())

因此树只有一片叶子:(1()())

此叶子的节点总和为78. 78不是77.结果:

您认为最合适的路径是什么,根据定义,没有。

第一棵树:

(-1()())

它只是一个叶子节点。一条路。总和为-1。 -1 = -1。结果:

我们可以使用Lisp程序检查它:

(defun leaf-p (node)
  "is the node a leaf?"
  (and (= (length node) 3)
       (integerp (first node))
       (null (second node))
       (null (third node))))

(defun path-sums (tree)
  "returns a list of all sums for each path"
  (if (leaf-p tree)
      (list (first tree))
    (mapcar (lambda (s)
              (+ (first tree) s))
            (append (when (second tree)
                      (path-sums (second tree)))
                    (when (third tree)
                      (path-sums (third tree)))))))

(defun tree-sum-p (sum tree)
  (member sum (path-sums tree)))

CL-USER 223 > (path-sums '(-1()()))
(-1)

CL-USER 224 > (path-sums '(77(1()())()))
(78)