二叉树的锯齿形层序遍历的思路探讨与源码
二叉树的锯齿形层序遍历的题目如下图,该题属于二叉树和搜索类型的题目,主要考察对于搜索方法的使用和二叉树本身特性的理解。本文的题目作者想到2种方法,分别是BFS广度优先搜索方法和DFS深度优先搜索方法,其中DFS深度优先搜索方法使用Java进行编写,而BFS广度优先搜索方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
本人认为该题目可以使用DFS深度优先搜索方法解决,首先初始化参数,并且从树根开始进行遍,在深度优先搜索函数的内部可以先判断是否为空,如果是就返回。然后判断下标是否大于列表的大小,如果是就把一个新的列表加入到结果列表里面。然后判断下标是奇数还是偶数,并且再次用左子树和右子树去调用深度优先搜索函数。直达函数结束并且最终返回结果。那么按照这个思路我们的Java代码如下:
#喷火龙与水箭龟
class Solution {
private List<List<Integer>> resFinal = new ArrayList<List<Integer>>();
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
searchDFS(root, 0);
return resFinal;
}
private void searchDFS(TreeNode flag, int index) {
if(flag == null){
return;
}
if(index >= resFinal.size()){
resFinal.add(new ArrayList<Integer>());
}
if(index % 2 == 1){
resFinal.get(index).add(0, flag.val);
}
else{
resFinal.get(index).add(flag.val);
}
searchDFS(flag.left,index+1);
searchDFS(flag.right,index+1);
}
}
显然,我们看到DFS深度优先搜索方法的效果不错,同时还可以使用BFS广度优先搜索方法。首先判断是否为空,如果是就直接返回结果,然后初始化列表和下标参数。开始遍历树,将每一层的结果取出并把当前值插入到结果里,同时判断左子树和右子树是否为空,如果非空就将它们插入到需要搜索的列表尾部。并且判断下标是否为偶数,如果是就需要将结果列表进行反转,然后把结果列表插入到最终的列表里,直到最终结束并返回最终的列表里的结果。所以按照这个思路就可以解决,下面是Python代码部分:
#喷火龙与水箭龟
class Solution:
def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
resFinal = []
index = 0
listRes = [root]
while listRes:
listArr = []
for _ in range(len(listRes)):
num = listRes.pop(0)
listArr.append(num.val)
if num.left:
listRes.append(num.left)
if num.right:
listRes.append(num.right)
if index % 2:
listArr.reverse()
resFinal.append(listArr)
index = index + 1
return resFinal
从结果来说Java版本的DFS深度优先搜索方法的效率不错,同样的Python版本的BFS广度优先搜索方法的速度也还可以,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。