找到预订的树高

时间:2013-01-30 19:48:58

标签: algorithm tree binary-tree depth preorder

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

1 个答案:

答案 0 :(得分:1)

好吧,我不禁感到难过,因为我们在评论中留下了马蒂。我认为他真的不知道从哪里开始,至少证明了他对这个问题的看法。

我们对完整二叉树有什么了解?每个节点都是叶子或有两个孩子。

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

想想这个问题:在前序遍历(完整的二叉树)的哪一点,我们知道我们已经耗尽了一个子树吗?我们将访问它的根,然后访问两个叶子(或者只是根叶子,如果它是叶子)。

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

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


Stack最初是空的。

int maxHeight = -1;

处理第一个字符:N

将节点推入堆栈:

堆叠:类型计数

  • N,0

    maxHeight = 0;


处理下一个字符:L

将节点推入堆栈:

  • L,0
  • N,0

    maxHeight = 1; //(递增1)

处理的最后一个字符是一个叶子,因此弹出并递增:

堆栈:

  • N,1

    maxHeight = 1;


处理下一个字符:N

将节点推入堆栈:

  • N,0
  • N,1

    maxHeight = 1; //不变


处理下一个字符:N

将节点推入堆栈:

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

    maxHeight = 2; //(递增1)


处理下一个字符:L

将节点推入堆栈:

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

    maxHeight = 3; //增加1

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

堆栈:

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

    maxHeight = 3; //不变


处理下一个字符:L

将节点推入堆栈:

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

    maxHeight = 3; //不变

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

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

顶部节点有计数2,所以弹出和增量:

  • N,1
  • N,1

处理下一个节点:L

将节点推入堆栈:

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

    maxHeight = 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