Data structures 单节点树的高度

Data structures 单节点树的高度,data-structures,tree,Data Structures,Tree,我在谷歌上搜索到,只有一个节点的树高没有正确答案。有时是节点计数,有时是边计数,有时是1,有时是0使用节点计数和使用其他时间边计数的情况是什么?节点的高度是从节点到叶的最长路径上的边数。叶节点的高度为0。树的高度是其根节点的高度。 在您的情况下,树的高度将为0。 有关详细答案,请查看此答案。 节点的高度是从节点到叶的最长路径上的边数。叶节点的高度为0。树的高度是其根节点的高度。 在您的情况下,树的高度将为0。 有关详细答案,请查看此答案。 这完全取决于你对(1)树和(2)高度的定义。但我们当然希

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

节点的高度是从节点到叶的最长路径上的边数。叶节点的高度为0。树的高度是其根节点的高度。 在您的情况下,树的高度将为0。 有关详细答案,请查看此答案。

节点的高度是从节点到叶的最长路径上的边数。叶节点的高度为0。树的高度是其根节点的高度。 在您的情况下,树的高度将为0。 有关详细答案,请查看此答案。
这完全取决于你对(1)树和(2)高度的定义。但我们当然希望保持这样一个特性,即高度是从树到树的一个整体函数;不应有未定义高度的树

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

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

type t = Empty | Node of t * t
现在我们可以定义高度,它应该是一个总函数:一棵空树的高度是零——它还能是什么非空树的高度是子树高度加上1的较大值:

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
再一次,我们可以给出高度的定义:具有空列表的节点的高度被定义为零,具有非空子节点的节点的高度是最大的子节点高度加上一

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)树和(2)高度的定义。但我们当然希望保持这样一个特性,即高度是从树到树的一个整体函数;不应有未定义高度的树

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

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

type t = Empty | Node of t * t
现在我们可以定义高度,它应该是一个总函数:一棵空树的高度是零——它还能是什么非空树的高度是子树高度加上1的较大值:

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
再一次,我们可以给出高度的定义:具有空列表的节点的高度被定义为零,具有非空子节点的节点的高度是最大的子节点高度加上一

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)) 
在这个定义中,只有一个节点的树的高度为零,我们计算边数。再看看我们的推理:

  • 高度是一个整体函数
  • 一棵空树不是合法的树,但一片叶子是合法的
  • 因此,叶子必须有高度
  • 叶子的合理高度是零
  • 因此,一棵单叶树的高度可能为零
但是我们也可以说一片叶子的高度是一,否则的话,定义是一样的,我们要计算节点数。从逻辑上讲,这是没有异议的

当使用节点计数和其他时间边缘计数时,会出现什么情况

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

如果没有空树