剑指Offer-24-从上往下打印二叉树

题目

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

解析

预备知识

层序遍历:顾名思义,依次打印每一层的节点的值。
层序遍历其实又是广度优先遍历(BFS)的一种特殊情况。那么什么是广度优先遍历呢。
从某一点出发,先访问开始位置的节点,然后依次访问这个节点的孩子节点,之后再访问这些孩子节点的子节点,直到全部遍历为止。

思路一

我们先用一个例子模拟题目要求的打印顺序,给定二叉树如下:

它的访问顺序为1 2 4 3。
我们按照上面层序遍历的知识来模拟此过程:
1. 首先访问根节点1,这时我们把它的孩子节点2,4放到一个容器中,(因为我们已经访问过1节点,如果不在此时保留1节点的孩子信息,之后我们获取)
2. 这时我们访问1的孩子节点2,2在容器中,直接取出即可。把2的孩子3存到容器中。
3. 继续访问1的另一个孩子节点4,因为4没有孩子节点,故省略了存孩子的操作。这时会发现4在3之前存入容器且比3先弹出,故我们想到了”先入先出”的队列数据结构。
4. 继续访问2的孩子节点3。3没有孩子节点,所以不用向容器中添加3的孩子。
5. 这时容器为空,说明遍历完毕!

综上,我们采用队列来模拟这个过程。首先根节点入队列;从队列取出一个节点,然后其孩子节点入队列;就这样不断从队列取节点,孩子节点出队列,直到队列为空为止。

    public static ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        if(root == null) {
            return null;
        }
        ArrayList<Integer> result = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            result.add(node.val);
            if(node.left != null) {
                queue.offer(node.left);
            }
            if(node.right != null) {
                queue.offer(node.right);
            }
        }
        return result;
    }

总结

将问题多与现有的模型结合即可。

猜你喜欢

转载自blog.csdn.net/dawn_after_dark/article/details/80934237