Collect the internal nodes of a binary tree in a list

题目

An internal node of a binary tree has either one or two non-empty successors. Write a predicate internals/2 to collect them in a list.

% internals(T,S) :- S is the list of internal nodes of the binary tree T.

内部节点即除了叶子节点以外所有的节点。

单元测试描述为:

from python99.btree.p410 import internals def test_internals(): E = 'E' assert internals([E, [E, None, [E, None, None]], [E, None, None]]) == [E, E] assert internals([E, [E, None, None], [E, None, None]]) == [E]

解题思路

递归遍历二叉树,如遇到内部节点(非叶子、非空)则返回节点值,遇到其它的则返回空列表。

举个例子,给定二叉树[E, [E, None, [E, None, None]], [E, None, None]]

  • 根节点有非空的子树,其是内部节点
    • 遍历左子树。左子节点有非空子树,所以其是内部节点
      • 遍历左子树。左子节点为空,所以其是非内部节点
      • 遍历右子树。右子节点左右子树都为空,所以其是非内部节点(叶子)
    • 遍历右子树。右子节点左右子树都为空,所以其是非内部节点(叶子)

代码实现:

def internals(t): if t is None: return [] if t[1] is None and t[2] is None: return [] return [t[0]] + internals(t[1]) + internals(t[2])

results matching ""

    No results matching ""