题目
分别用递归与非递归算法求二叉树深度。
分析
方法一:
递归方法大家都很熟悉,如何用非递归求解呢?
我们知道二叉树有层序遍历,利用层序遍历的过程,记录当前层数,那么遍历结束后也就求得二叉树的层数,即深度。
方法二:
层序遍历需要使用一个队列来保存树的节点。初始化讲根节点入队。接着只要队列不为空,则出队,并将出队元素的子节点入队。
当需要记录树的深度时,可以使用两个队列,第一个队列保存当前访问的那一层的节点,讲当前这一层的节点的子节点压入下一队列,这样需要两个队列的额外空间。
若只使用一个队列,则需要一个特殊的标记mark。当我们把某一层的节点入队之后,再压入一个标记mark。当我们在出对是遇到一个标记mark时,我们就知道已经访问完了一层,则当前队列中的元素全部是下一层的节点,我们再压入一个标记mark。用标记mark来标记层数,可以减少一个队列的使用,但是前提是保存队列的数据结构能找到特殊的mark元素。
当需要记录树的深度时,可以使用两个队列,第一个队列保存当前访问的那一层的节点,讲当前这一层的节点的子节点压入下一队列,这样需要两个队列的额外空间。
若只使用一个队列,则需要一个特殊的标记mark。当我们把某一层的节点入队之后,再压入一个标记mark。当我们在出对是遇到一个标记mark时,我们就知道已经访问完了一层,则当前队列中的元素全部是下一层的节点,我们再压入一个标记mark。用标记mark来标记层数,可以减少一个队列的使用,但是前提是保存队列的数据结构能找到特殊的mark元素。
方法三:利用后序遍历的思想
受后续遍历二叉树思想的启发,想到可以利用后续遍历的方法来求二叉树的深度,在每一次输出的地方替换成算栈S的大小,遍历结束后最大的栈S长度即是栈的深度。
算法的执行步骤如下: <
算法的执行步骤如下: <