二叉树的层序遍历题目的思路探讨与源码
二叉树的层序遍历的题目如下图,该题属于树结构和广度优先算法BFS类型的题目,主要考察对于树本身结构以及BFS搜索的理解和认识,结合二叉树的左右子树进行思考就可以进行求解,因为二叉树的特征是可以通过不断去遍历当前节点的左右子节点去放到队列里的,方便每次遍历每一层的结果。本文的题目作者想到2种方法,第一种方法是BFS广度优先搜索方法,第二种方法是迭代方法。其中第一种方法使用java写、第二种方法使用Python写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
本人认为该题目可以使用递归法和广度优先搜索方法,首先来说广度优先搜索方法。我们观察初始情况,当树的当前节点是空的时候,直接返回结果是空。而当每次访问的节点,我们可以拿到当前节点的左子节点和右子节点,并按顺序放入队列。通过不断去遍历这个队列,我们可以得到最终的层序遍历结果,所以整体的步骤是属于一个层次搜索的过程,按照这个思路我们的代码如下:
#喷火龙与水箭龟
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> resList = new ArrayList<List<Integer>>();
if(root==null) {
return resList;
}
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
while(queue.size()>0) {
int num = queue.size();
List<Integer> tmpList = new ArrayList<Integer>();
for(int ir=0;ir<num;ir++) {
TreeNode tree = queue.remove();
tmpList.add(tree.val);
if(tree.left != null) {
queue.add(tree.left);
}
if(tree.right != null) {
queue.add(tree.right);
}
}
resList.add(tmpList);
}
return resList;
}
}
显然,还可以使用迭代的方法来进行解决,最初将一个栈记为传入的树和深度=1,然后遍历这个栈,将栈的最后一个元素弹出,得到当前节点的信息和深度,将弹出元素后的栈的长度和深度比较,如果栈长度小,则将空列表插入到结果。然后开始将节点的根的值插入到结果列表里,并判断此时的节点右子节点和左子节点是否为空,如果非空,则将右子节点或者左子节点插入到栈里,直到栈为空。所以根据这个思路就可以写出代码,下面是Python代码部分:
#喷火龙与水箭龟
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
resFinal = []
if(root is None):
return resFinal
stackList = [(root, 1)]
while stackList:
vex,length = stackList.pop()
if(len(resFinal) < length):
resFinal.append([])
resFinal[length-1].append(vex.val)
if(vex.right):
stackList.append((vex.right,length+1))
if(vex.left):
stackList.append((vex.left,length+1))
return resFinal
从结果来说java版本的广度优先搜索方法还不错,python版本的迭代算法速度也还可以,应该是可以进一步提速的,希望朋友们能够多多指教,非常感谢。