LeetCode刷题——二叉树的锯齿形层序遍历#103#Medium

二叉树的锯齿形层序遍历的思路探讨与源码
     二叉树的锯齿形层序遍历的题目如下图,该题属于二叉树和搜索类型的题目,主要考察对于搜索方法的使用和二叉树本身特性的理解。本文的题目作者想到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广度优先搜索方法的速度也还可以,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。

猜你喜欢

转载自blog.csdn.net/qq_26727101/article/details/121869135