leetcode笔记——102二叉树的层次遍历

题目:

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

思路:网上大神的代码。原文链接:https://blog.csdn.net/l294265421/article/details/51226156。

层次遍历二叉树就是按照层的顺序从左到右的访问二叉树中的元素。用一个队列进行辅助,用一个 LinkedList来存放每一层的元素,用一个ArrayList存放最后的结果集。将每一层的元素存入队列并且加入一个用于标记每一层结束的null。当遇到null之前,将队列中的元素依次加入到linkedlist中。因为最后一个null没有办法被访问到,导致保存最后一层元素的levelList没办法在循环中被添加进resultList。所以在循环外添加。代码为以下的代码1.

这个好像是二叉树的广度优先搜搜,不过需要注意一行什么时候结束。这个题是直接向得到一行的个数依次减1,到0时说明这一行已经结束。代码如代码2.

 

代码1:

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
     List<List<Integer>> resultList = new ArrayList<List<Integer>>();
        if (root == null) {
            return resultList;
        }
        List<Integer> levelStorage = new LinkedList<Integer>();
        LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        queue.offer(null);
        while (queue.size() > 1) {
            TreeNode top = queue.poll();
            if (top == null) {
                resultList.add(levelStorage);
                queue.offer(null);
                levelStorage = new LinkedList<Integer>();
            }
            else {
                levelStorage.add(top.val);
                if (top.left != null) {
                    queue.offer(top.left);
                }
                if (top.right != null) {
                    queue.offer(top.right);
                }
            }
        }
        resultList.add(levelStorage);
        return resultList;
    
    }
}

代码2:

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res=new ArrayList<>();
        if(root==null)
          return new ArrayList<>();
        Queue<TreeNode> queue=new LinkedList<>();
     queue.add(root);
        while(!queue.isEmpty()){
          int level=queue.size();
            List<Integer> list=new ArrayList<>();
            while(level>=1){
              TreeNode temp=queue.poll();
                list.add(temp.val);
                level--;
                 if(temp.left!=null)
                queue.add(temp.left);
            if(temp.right!=null)
                queue.add(temp.right);
            }
            res.add(list);
           
        }
        return res;
    }
      
}

LeetCode执行最快的代码:

以下使用递归的方法进行。递归时,将当前的根节点,结果集和一个标志位作为参数。当当前节点为空时,递归结束。

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
      int tier = 0;
		List<List<Integer>> list = new ArrayList<List<Integer>>();
		order(list, root, tier);
		return list;
	}

	public static List<List<Integer>> order(List<List<Integer>> list,
			TreeNode root, int tier) {
		tier++;
		if (root == null) {
			return list;
		}
		if (list.size() <= tier - 1) {
			list.add(new ArrayList<Integer>());
		}
		list.get(tier - 1).add(root.val);
		order(list, root.left, tier);
		order(list, root.right, tier);
		return list;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值