给定完整二叉树的前序遍历,其中每个节点都标记为叶节点或内部节点,是否有一个很好的算法来查找树的高度?例如,如果N表示内部节点而L表示叶子,则给定前序遍历NLNNLLL,高度将为3。
答案 0 :(得分:1)
好吧,我不禁感到难过,因为我们在评论中留下了马蒂。我认为他真的不知道从哪里开始,至少证明了他对这个问题的看法。
我们对完整二叉树有什么了解?每个节点都是叶子或有两个孩子。
前序遍历以递归方式访问根,左子树,然后右子树。
想想这个问题:在前序遍历(完整的二叉树)的哪一点,我们知道我们已经耗尽了一个子树吗?我们将访问它的根,然后访问两个叶子(或者只是根叶子,如果它是叶子)。
让我们制作一个特殊结构的堆栈:
struct StackNode{
size_t count; //initialize to 0
char nodeType; //'N' or 'L'
};
这个'StackNode'对象将使用'nodeType'变量跟踪我们在前序遍历中访问过的节点类型,这应该是明确的。我们还有一个特殊的计数器'计数',我们将其初始化为0.
解决方案背后的想法是:
每次将节点推入堆栈时,都可以检查树的当前高度。它是stack-1中的项目数(将底部的项目视为根)。
只要您跟踪到目前为止遇到的最大高度,您就会找到树的高度。
让我们通过您的示例:NLNNLLL
Stack最初是空的。
int maxHeight = -1;
处理第一个字符:N
将节点推入堆栈:
堆叠:类型计数
N,0
maxHeight = 0;
处理下一个字符:L
将节点推入堆栈:
N,0
maxHeight = 1; //(递增1)
处理的最后一个字符是一个叶子,因此弹出并递增:
堆栈:
N,1
maxHeight = 1;
处理下一个字符:N
将节点推入堆栈:
N,1
maxHeight = 1; //不变
处理下一个字符:N
将节点推入堆栈:
N,1
maxHeight = 2; //(递增1)
处理下一个字符:L
将节点推入堆栈:
N,1
maxHeight = 3; //增加1
最后一个节点是一个叶子,所以弹出并递增
堆栈:
N,1
maxHeight = 3; //不变
处理下一个字符:L
将节点推入堆栈:
N,1
maxHeight = 3; //不变
最后一个节点是一个叶子,所以弹出并递增:
顶部节点有计数2,所以弹出和增量:
处理下一个节点:L
将节点推入堆栈:
N,1
maxHeight = 3; //不变
最后一个节点是一个叶子,所以弹出并递增:
顶部节点有计数2,所以弹出和增量:
顶部节点有计数2,所以弹出和增量:
(empty stack), finished
maxHeight = 3; //the maximum height discovered during a preorder of a full binary tree