单节点树的高度

时间:2017-03-23 05:10:14

标签: data-structures tree

我用谷歌搜索了只有一个节点的树高没有正确的答案。有时它是节点计数,有时是边数统计,有时它是1,其他时间是0。 使用节点计数和使用其他时间边计数时的情况是什么?

2 个答案:

答案 0 :(得分:4)

完全取决于你对(1)树的定义,以及(2)高度。但我们当然希望保持高度是从树到内的总函数的属性;应该没有未定义高度的树。

假设我们有一个二叉树的定义:

树被定义为(1)空树,或(2)一对树,称为左右子树。

type t = Empty | Node of t * t

现在我们可以定义高度,它应该是一个总函数:空树的高度为零 - 它还能是什么? - 非空树的高度是子树高度加一:

let max x y = if x > y then x else y
let rec height tree = match tree with 
  | Empty -> 0
  | Node (left, right) -> 1 + max (height left) (height right)

现在,请注意让我们来到这里的逻辑链:

  • 身高是一个总功能
  • 空是一个合法的树
  • 因此空树必须有高度
  • 空树的唯一合理高度为零
  • 因此,具有单个节点的树的高度必须为1。

如果我们否认其中一些前提,那么我们可以提出其他答案。例如,如果没有空树怎么办?

树被定义为树的列表,可能是空的:

type t = Node of t list

我们再次提出高度定义:具有空列表的节点的高度定义为零,具有非空子节点的节点的高度是最大子高度加1。

let max x y = if x > y then x else y
let rec height tree = match tree with
  | Node [] -> 0
  | Node h :: t -> max (1 + height h) (height (Node t)) 

在此定义中,具有单个节点的树的高度为零,我们计算边缘。再看看我们的推理:

  • 身高是一个总功能
  • 空树不是合法树,但是叶子
  • 因此叶子必须有高度
  • 叶子的合理高度为零
  • 因此,单叶的树可以具有零高度。

但是我们已经说过叶子的高度是一个,否则具有相同的定义,我们就是在计算节点。在逻辑上没有反对意见。

  

使用节点计数和使用其他时间边计数时的情况是什么?

如果空树是合法的,那么显然只有节点计数才有意义。如果我们尝试计算边数,则无法区分空树的高度与单节点树的高度,并保持高度为总函数。

如果空树不合法,那么要么合理。由于两个高度函数之间的关系是"它们恰好相差一个",因此使用哪个定义并不重要;如果您想使用其他定义,只需适当地添加或减去一个。

平衡树木时,我们并不关心绝对的高度;我们关心两棵树之间的高度差异。在那些算法中,无论我们计算边缘还是节点都无关紧要。无论如何,差异都是一样的。很多时候它并不重要,所以选择你想要的更好。

答案 1 :(得分:0)

节点的高度是从节点到叶子的最长路径上的边数。叶节点的高度为0.树的高度是其根节点的高度。 在您的情况下,树的高度将为0。 详细解答请查看这一个。 What is the difference between tree depth and height?