【问题标题】:Find tree height given preorder [closed]查找给定预购的树高[关闭]
【发布时间】:2013-01-30 19:48:58
【问题描述】:

给定一个完整二叉树的前序遍历,其中每个节点都标记为叶节点或内部节点,是否有一个好的算法来找到树的高度?例如,如果 N 代表一个内部节点,L 代表一个叶子,那么给定前序遍历 NLNNLLL,高度将是 3。

【问题讨论】:

  • 问题是什么?你试过什么?
  • 我希望没有人回答这个问题,直到您说出您的尝试并发布代码并提出更多相关问题...我们不是来做您的功课
  • @thiton:“homework”标签现在应该已经过时了,但不知道为什么。编辑:这里:meta.stackexchange.com/questions/147100/…
  • 我只能想到重新创建树并找到它的深度。但我相信还有更简单的方法。
  • @marti:重建树对你有什么帮助?您可能没有完全理解什么是前序遍历。

标签: algorithm tree binary-tree depth preorder


【解决方案1】:

好吧,我不禁为我们将 marti 留在 cmets 中而感到难过。我认为他真的不知道从哪里开始,并且至少表明他已经考虑过这个问题。

我们对完全二叉树了解多少?每个节点要么是叶子,要么有两个孩子。

前序遍历递归地访问根,左子树,然后右子树。

想一想这个问题:在(完整二叉树的)前序遍历中的什么时候,我们知道我们已经用尽了一个子树?我们将访问它的根,然后访问两片叶子(如果是叶子,则只访问根)。

让我们做一个特殊结构的堆栈:

struct StackNode{
   size_t count; //initialize to 0
   char nodeType; //'N' or 'L'
};

这个“StackNode”对象将使用“nodeType”变量跟踪我们在前序遍历中访问的节点类型,这应该很清楚。我们还有一个特殊的计数器“计数”,我们将其初始化为 0。

解决方案背后的想法是这样的:

  • 每次遇到“N”时,创建一个 StackNode,并将其压入堆栈。
  • 每次遇到“L”时,创建一个 StackNode,并将其压入堆栈
  • 如果您压入堆栈的最后一个节点是“L”,则弹出最后一个节点,然后将 stack.top() 的计数加 1
  • 如果 stack.top() 的计数为 2,则从堆栈中弹出顶部,然后将 stack.top() 的计数增加 1(重复直到堆栈为空或您已停止从堆栈中弹出堆栈)

每次将节点压入堆栈时,您都可以检查树的当前高度。它是您的 stack-1 中的项目数(说明底部的项目是根)。

只要你跟踪你迄今为止遇到的最大高度,你就会找到你的树的高度。

让我们看看你的例子:NLNNLLL


堆栈最初是空的。

int maxHeight = -1;

处理第一个字符:N

将一个节点压入堆栈:

堆栈:类型计数

  • N, 0

    最大高度 = 0;


处理下一个字符:L

将一个节点压入堆栈:

  • L, 0
  • N, 0

    最大高度 = 1; //(增加1)

最后处理的字符是叶子,所以弹出并递增:

堆栈:

  • N, 1

    最大高度 = 1;


处理下一个字符:N

将一个节点压入堆栈:

  • N, 0
  • N, 1

    最大高度 = 1; //不变


处理下一个字符:N

将一个节点压入堆栈:

  • N, 0
  • N, 0
  • N, 1

    最大高度 = 2; //(增加1)


处理下一个字符:L

将一个节点压入堆栈:

  • L, 0
  • N, 0
  • N, 0
  • N, 1

    最大高度 = 3; //递增1

最后一个节点是叶子,所以弹出并递增

堆栈:

  • N, 1
  • N, 0
  • N, 1

    最大高度 = 3; //不变


处理下一个字符:L

将一个节点压入堆栈:

  • L, 0
  • N, 1
  • N, 0
  • N, 1

    最大高度 = 3; //不变

最后一个节点是叶子,所以弹出并递增:

  • N, 2
  • N, 0
  • N, 1

顶部节点的计数为 2,因此弹出并递增:

  • N, 1
  • N, 1

处理下一个节点:L

将一个节点压入堆栈:

  • L, 0
  • N, 1
  • N, 1

    最大高度 = 3; //不变

最后一个节点是叶子,所以弹出并递增:

  • N, 2
  • N, 1

顶部节点的计数为 2,因此弹出并递增:

  • N, 2

顶部节点的计数为 2,因此弹出并递增:

(empty stack), finished

maxHeight = 3; //the maximum height discovered during a preorder of a full binary tree

【讨论】:

  • 我真的需要推送叶子还是将其与堆栈中的节点进行比较就可以了??
  • 在这里编码解决方案shrib.com/proo 仍然没有被法官接受。
  • @marti:我还没有通读你所有的代码,但是你做错的一件事是:int maxh=0;您将高度实例化为 0 而不是 -1。当根节点被推到树上时,高度将变为 1,这是错误的。当某些东西不工作时,“它不工作”并不能帮助我们调试。请至少提供一个测试输入/输出以显示它是如何不工作的。更好的是,找到不起作用的特定逻辑并指出它。
  • L 的单个值在应为 0 时导致 answer-1,我最初在开头推送第一个节点,这就是为什么我有 maxh =0 而不是 -1。我不能说明为什么它不能作为不透露测试用例的在线法官工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 2017-03-05
  • 2018-10-16
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2015-03-01
相关资源
最近更新 更多