剑指Offer-->从上向下打印二叉树(层序遍历 + 详解)

    这道题目难度一般,重要的是想到以队列作为辅助来解决。
    分析:因为按层打印的顺序决定了先打印的应该为根结点。为了接下来能够打印值为 8 的结点的两个子结点,应该在遍历到该结点时把值为 6 和 10 的两个结点保存到一个容器里,此时容器中含有 6 和 10 两个结点。按照从左到右的要求,先取出值为 6 的结点。打印出值 6 之后分别把 5 和 7 两个左右子结点放入容器 ,此时容器中的结点有三个,分别是10 、 5 和 7 。接下来我们从容器中取出值为 10 的结点,注意到 10 比另外两个元素先进入,因此先将 10 取出,并再把 10 的两个结点放入,此时容器中的元素为 5 、 7 、 9 、 11。由此可以看出取元素的顺序符合先进先出原则,我们则判断需要通过队列来解决这个问题。由于这四个结点都没有子结点,因此只需要依次打印即可。打印过程如图所示:
      
    
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;

/**
 * Created by zhangshuyou on 2015/5/22.
 */

/**
 * 题目描述:
 * 从上往下打印出二叉树的每个节点,同层节点从左至右打印(即层序遍历)
 * 1.元素 8 出队,放入list,得到 6 、 10
 * 2.元素 6 出队,放入list,得到 (10) 5 、7
 * 3.元素 10 出队,放入list,得到 (5) (7) (9) (11)
 * 4.均无子结点,直接打印
 */
public class Solution {
    //建立一个数组双端队列,是大小可变数组。线程不安全,但在速度上有一定的优势。
    Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
    ArrayList<Integer> list = new ArrayList<Integer>();

    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        if(root == null)
            return list;
        queue.add(root);  //将结点入队
        while(!queue.isEmpty()){
            TreeNode treeNode = queue.poll(); //将元素出队并保存
            list.add(treeNode.val); //将元素的值取到并添加到集合中

            if(treeNode.left != null)
                queue.add(treeNode.left);
            if(treeNode.right != null)
                queue.add(treeNode.right);
        }
        return list;
    }
}

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值