lintcode69-二叉树层次遍历

  Question:
  二叉树的层次遍历
  给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)
 
  样例
  给一棵二叉树 {3,9,20,#,#,15,7}
     3
     / \
    9  20
        /  \
     15   7
  [
     [3],
     [9,20],
     [15,7]
   ]
   挑战1:只使用一个队列去实现它
   挑战2:用BFS算法来做

  Solution:
  BSF广度优先算法,一层一层的进行遍历
 
  二叉树的层次遍历需要借助一个队列
  由于队列的特性是先进先出,在出队的时候访问元素,该算法就取决于元素何时入队列
  1、先将根节点入队
  2、如果当前节点是队列头节点,出队并访问
  3、如果当前节点左节点不为空则左节点入队
  4、如果当前节点右节点不为空,将右节点入队,所以出队顺序也是按行从左到右依次出队
 
  层次遍历的问题已经解决了,如何解决每一层结果放到一个List中呢,
  可以在每一层遍历的时候一次性出队完成,即拿到队列里面需要出队的本层元素的个数,全部出队,并按照顺序把他们的左右儿子再次入队
  下次遍历的时候,拿的就是再下一层总的元素个数

public class Q69_binaryTreeLevelOrderTraversal {
    
    public List<List<Integer>> levelOrder(TreeNode root) {
        // write your code here
        if(root == null)
            return null;
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
        TreeNode current = null;
        //根元素入队
        queue.offer(root);
        while(!queue.isEmpty()) {
            List<Integer> currentList = new ArrayList<Integer>();
            //一层元素总数
            int layerCount = queue.size();
            //一次性出队一层全部元素
            while(layerCount-- != 0) {
                //出队头元素并访问
                current = queue.poll();
                currentList.add(current.val);
                if(current.left != null) {
                    queue.offer(current.left);
                }
                if(current.right != null) {
                    queue.offer(current.right);
                }
            }
            result.add(currentList);
        }
        return result;
    }

    @Test
    public void test() {
        TreeNode root = new TreeNode(3);
        root.left = new TreeNode(9);
        root.right = new TreeNode(20);
        root.right.left = new TreeNode(15);
        root.right.right = new TreeNode(7);
        List<List<Integer>> result = levelOrder(root);
        System.out.println(result.toString());
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值