考虑使用Scheme列表实现二叉树,如下所示 例: tree< ------------------------------------------- ----------------------------------------
1)树的高度定义为路径上的最大节点数 一根叶子的根。写一个递归函数(高度T)
(身高T) 4
2)写一个递归函数(postorder T),它返回所有的列表 树T中的元素对应于树的后序遍历。
(后序T) (1 9 8 5 17 25 22 13)
对于第一个:我只能获得总节点,但不能获得高度。 第二个我不知道该怎么做。
本周从C ++开始计划
任何提示或解决方案?
答案 0 :(得分:0)
如果它是空树,则高度为0,例如。比如树中1
节点的子节点。对于所有其他节点,其1
加上子节点的最大值。代码的框架可能如下所示:
(define (height tree)
(if (eq? *tree-null* tree)
...
(max (height ...)
(height ...))))
对于后期订单,您需要再次遍历:
(define (postorder tree)
(if (eq? *tree-null* tree)
...
(append (postorder ...)
(porstorder ...)
(list (tree-value tree)))))
注意两者是如何相似的?有人可能会抽象:
(define (accumulate-tree tree combiner null-value)
(let rec ((tree tree))
(if (eq? *tree-null* tree)
null-value
(combiner (tree-value tree)
(rec (tree-left tree))
(rec (tree-right tree))))))
(define (height tree)
(accumulate-tree tree (lambda (v l r) (+ 1 l r)) 0))
(define (postorder tree)
(accumulate-tree tree (lambda (v l r) (append l r (list v))) '()))