【问题标题】:What is the difference between tree depth and height?树的深度和高度有什么区别?
【发布时间】:2011-02-05 22:00:37
【问题描述】:

这是算法理论中的一个简单问题。
它们之间的区别在于,在一种情况下,您计算节点数,而在其他情况下计算根节点和具体节点之间最短路径上的边数。
哪个是哪个?

【问题讨论】:

  • 提示:为了避免术语之间的混淆: 1. 身高:想象测量一个人的身高,我们从脚趾到头(叶到根)测量。 2. 深度:想象一下测量海洋的深度,我们从地表到海床(从根到叶)进行测量。
  • @Yesh 这是一个很好的类比。
  • 补充@Yesh 的一个很好的类比:对于树中间的某个内部节点,它的深度是它在根节点之下的层数,它的高度是它上面的层数其最底部的子节点。
  • 这里要小心,伙计们 - 高度是从头到脚测量的,就像从节点到叶的定义一样,并且会在树中向下遍历。想想一个失去一条腿的简笔画。那里的节点没有定义他的高度,因为它不是最长的路径。不过,我们可以说我们找到了那个节点的深度

标签: algorithm data-structures tree nodes terminology


【解决方案1】:

我了解到深度和高度是节点的属性:

  • 节点的深度是从节点到树根节点的边数。
    根节点的深度为 0。

  • 节点的高度是从节点到叶子的最长路径上的边数。
    叶子节点将有高度为 0。

树的属性

  • 一棵树的高度将是其根节点的高度,
    或等效地,其最深节点的深度。

  • 树的直径(或宽度)是任意两个叶节点之间最长路径上的节点数.下面这棵树的直径为 6 个节点。

【讨论】:

  • +1 即将在此处添加具有相同内容的引用:en.wikipedia.org/wiki/Tree_%28data_structure%29
  • 是指高度 == 最大深度
  • @rkm_Hodor:是的,树的高度总是等于最深节点的深度
  • 您能否引用一个来源来说明您声称树的直径计算节点而不是边缘的来源?这与要求最长路径的图形直径的通常定义(参见例如en.wikipedia.org/wiki/Distance_(graph_theory))相冲突。
  • @j_random_hacker 这是定义问题,选择对您最有用的。要从顶点数到边数,只需减去 1。我更喜欢计算顶点数,因为这会导致一个图只有一个节点的宽度为 1,而一个空图的宽度为 0。@987654323 @
【解决方案2】:

一棵树的高度和深度是相等的......

但是节点的高度和深度不相等,因为...

高度是通过从给定节点遍历到可能最深的叶子来计算的。

深度是从根到给定节点的遍历计算出来的.....

【讨论】:

  • “高度是通过从叶子遍历到给定节点来计算的”这是不正确的,叶子必须是给定节点的所有叶子中最深的那个。
【解决方案3】:

根据 Cormen 等人的说法。算法介绍(附录 B.5.3),节点 X 在树 T 中的深度定义为从 T 的根节点到 X 的简单路径的长度(边数)。节点 Y 的高度为从 Y 到叶子的最长向下简单路径上的边数。树的高度定义为它的根节点的高度。

请注意,简单路径是没有重复顶点的路径。

的高度等于的最大深度。节点的深度和节点的高度不一定相等。参见 Cormen 等人第 3 版的图 B.6。这些概念的说明。

我有时会看到要求计算节点(顶点)而不是边数的问题,因此如果您不确定是否应该在考试或求职面试中计算节点或边数,请要求澄清。

【讨论】:

  • 计算节点和边有什么不同。似乎两者都会给出相同的结果。如果我错了,请纠正我。
  • @jdhao 根的深度怎么可能是2?它是 0(如果考虑边)或 1(如果考虑节点)。
  • @neowulf33,是的,我大错特错了。根节点的深度应该为0,为了不让人迷惑,我将删除我的评论。
【解决方案4】:

我知道这很奇怪,但 Leetcode 也根据路径中的节点数来定义深度。所以在这种情况下,深度应该从 1 开始(总是计算根)而不是 0。以防有人像我一样有同样的困惑。

【讨论】:

【解决方案5】:

简单的答案:
深度:
1。 :从树的根节点到叶子节点的边/弧数称为树的深度。
2。 节点:从根节点到该节点的边/弧数称为该节点的深度。

【讨论】:

    【解决方案6】:

    理解这些概念的另一种方法如下: 深度:在根位置画一条水平线,把这条线当作地面。所以根的深度为0,所有的子节点都向下增长,所以每一层节点的当前深度+1。

    高度:相同的水平线,但这次地面位置是外部节点,即树的叶子,向上计数。

    【讨论】:

    • 很好的记忆方式。谢谢!
    【解决方案7】:

    我想发表这篇文章,因为我是一名 CS 本科生,而且我们越来越多地使用 OpenDSA 和其他开源教科书。从最高评价的答案看来,教授高度和深度的方式已经从一代到下一代发生了变化,我发布这个是为了让每个人都知道这种差异现在存在,希望不会导致任何错误程式!谢谢。

    来自OpenDSA Data Structures & Algos book

    如果 n1, n2,...,nk 是树中的节点序列,例如 即 ni 是 ni+1 for 11 到 nk 的路径。路径的长度为 k-1。 如果存在从节点 R 到节点 M 的路径,则 R 是 M,而 M 是 R 的后代。因此,树中的所有节点都是 树的根的后代,而根是树的祖先 所有节点。 树中节点 M 的深度是树的长度 从树根到 M 的路径。一棵树的高度多一倍 比树中最深节点的深度。 深度为 d 的所有节点 在树的第 d 层。根是级别 0 的唯一节点,并且 它的深度是0。

    图 7.2.1:二叉树。节点 A 是根。节点 B 和 C 是 A的孩子。节点 B 和 D 一起形成一个子树。节点 B 有 两个孩子:左孩子是空树,右孩子是 D. 节点 A、C 和 E 是 G. 节点 D、E 和 F 的祖先 构成树的第 2 层;节点 A 处于级别 0。来自 A 的边 到 C 到 E 到 G 形成一条长度为 3 的路径。节点 D、G、H 和 I 是叶子。节点 A、B、C、E 和 F 是内部节点。深度 我是 3。这棵树的高度是 4。

    【讨论】:

    • 对于它的价值,这个链接的定义已更改为:“树中节点M的深度是从树的根到M的路径长度. 树的高度是树中最深节点的深度。"
    • @ashtree:你的意思是说这棵树的高度是3,而不是4?
    • @TaimurAhmedQureshi 看起来自从我发布以来,他们更改了定义,^kaya3 指出。所以最初高度应该是 4,但有了 kaya3 的回答,现在,是的,它是 3。
    【解决方案8】:

    Daniel A.A. 的回答Pelsmaeker 和 Yesh 的类比非常好。我想从hackerrank教程中添加更多内容。希望它也能有所帮助。

    • 节点的深度(或级别)是它与树根节点的距离(即边数)。
    • 高度是根节点和最远叶子之间的边数。
    • height(node) = 1 + max(height(node.leftSubtree),height(node.rightSubtree)).
      在阅读前面的示例之前,请记住以下几点。
    • 任何节点的高度都是 1。
    • 空子树的高度为-1。
    • 单个元素树或叶子节点的高度为0。

    【讨论】:

      【解决方案9】:

      节点的“深度”(或等效的“级别数”)是从根节点开始的“路径”上的边数

      节点的“高度”是从节点到叶节点的最长路径上的边数。

      【讨论】:

      • 嗨,天后。由于该问题已经有一个可接受的答案,并且此特定答案不会添加任何其他详细信息。您可能会发现一些关于 SO 政策的相关讨论 here
      【解决方案10】:

      树的整体深度等于树的高度和树的层级相同但是如果对于特定的节点高度不等于深度因为深度的定义 表示从根节点到该节点的最长路径,在 Height 的情况下是从该节点到叶节点。

      整体树,D=H=L 但是对于一个节点 D=L 但是 D 可能不等于 H。

      【讨论】:

      • 其他答案以更清晰的方式说同样的话。
      猜你喜欢
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多