我正在研究UVa #112 Tree Summing。我认为应该是一个有效的解决方案,但由于我对问题的基本误解,它不被在线评委接受。请考虑以下输入:
-1 (-1()())
77 (77(1()())())
或图解说,树看起来像:
-1 77
/ \ / \
() () 1 ()
/ \
() ()
根据至少两种工作方案,上述输入的正确输出为:
yes
no
然而,我不明白为什么第二个应该是'不'。在我看来,树的最右边的路径应该给出适当的总和。我错过了什么?
答案 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)