我用谷歌搜索了只有一个节点的树高没有正确的答案。有时它是节点计数,有时是边数统计,有时它是1,其他时间是0。 使用节点计数和使用其他时间边计数时的情况是什么?
答案 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)
现在,请注意让我们来到这里的逻辑链:
如果我们否认其中一些前提,那么我们可以提出其他答案。例如,如果没有空树怎么办?
树被定义为树的列表,可能是空的:
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?