• Binary Tree Level Order Traversal,层序遍历二叉树,每层作为list,最后返回List<list>


    问题描述:

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

    For example:
    Given binary tree [3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7
    

    return its level order traversal as:

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

     算法分析:三种方法。这道题和普通的层序遍历不一样的地方就是,需要每层单独输出。因此可以考虑用来两个队列,每个队列存放不同层的节点。我自己写的代码有重复的结构,并不友好。参考网上,其实将第二个队列赋值给第一个队列就行,就不会有重复代码了。也无需考虑队列空的情况了。第三种方法其实就是按层遍历的一种思想,是第二种方法的优化。

    public class BinaryTreeLevelOrderTraversal 
    {
    	public List<List<Integer>> levelOrder(TreeNode root)
    	{
    		List<List<Integer>> res = new ArrayList<>();
    		if(root == null)
    		{
    			return res;
    		}
    		Deque<TreeNode> queue1 = new ArrayDeque<>();
    		Deque<TreeNode> queue2 = new ArrayDeque<>();
    		queue1.offer(root);
    		while(!queue1.isEmpty() || !queue2.isEmpty())
    		{
    			List<Integer> list1 = new ArrayList<>();
    			while(!queue1.isEmpty())
    			{
    				TreeNode temp = queue1.poll();
    				if(temp.left != null)
    				{
    					queue2.offer(temp.left);
    				}
    				if(temp.right != null)
    				{
    					queue2.offer(temp.right);
    				}
    				list1.add(temp.val);
    			}
    			if(list1.size() != 0)//队列空的时候,list1的大小为0
    			res.add(list1);
    			List<Integer> list2 = new ArrayList<>();
    			while(!queue2.isEmpty())
    			{
    				TreeNode temp = queue2.poll();
    				if(temp.left != null)
    				{
    					queue1.offer(temp.left);
    				}
    				if(temp.right != null)
    				{
    					queue1.offer(temp.right);
    				}
    				list2.add(temp.val);
    			}
    			if(list2.size() != 0)
    			res.add(list2);
    		}
    		
    		return res;
    	}
    	
    	public List<List<Integer>> levelOrder2(TreeNode root)
    	{
    		List<List<Integer>> res = new ArrayList<>();
    		List<Integer> list = new ArrayList<>();
    		if(root == null)
    		{
    			return res;
    		}
    		
    		ArrayDeque<TreeNode> curr = new ArrayDeque<>();
    		ArrayDeque<TreeNode> next = new ArrayDeque<>();
    		
    		curr.offer(root);
    		
    		while(!curr.isEmpty())
    		{
    			TreeNode temp = curr.poll();
    			if(temp.left != null)
    			{
    				next.offer(temp.left);
    			}
    			if(temp.right != null)
    			{
    				next.offer(temp.right);
    			}
    			
    			list.add(temp.val);
    			
    			if(curr.isEmpty())
    			{
    				res.add(list);
    				list = new ArrayList<Integer>();
    				curr = next;
    				next = new ArrayDeque<>();
    			}
    		}
    		
    		return res;
    	}
    	
    	
    	public List<List<Integer>> levelOrder3(TreeNode root)
    	{
    		List<List<Integer>> res = new ArrayList<>();
    		
    		if(root == null)
    		{
    			return res;
    		}
    		ArrayList<TreeNode> arr = new ArrayList<>();
    		arr.add(root);
    		while(!arr.isEmpty())
    		{
    			List<Integer> list = new ArrayList<>();
    			ArrayList<TreeNode> temp = new ArrayList<>();
    			for (TreeNode node : arr) 
    			{
    				list.add(node.val);
    				if(node.left != null)
    				{
    					temp.add(node.left);
    				}
    				if(node.right != null)
    				{
    					temp.add(node.right);
    				}
    			}
    			res.add(list);
    			arr = temp;
    		}
    		
    		return res;
    	}
    	
    	
    	public List<List<Integer>> levelOrderBottom(TreeNode root) {
            List<List<Integer>> res = new ArrayList<>();
            List<Integer> list = new ArrayList<>();
            
            Deque<TreeNode> curr = new ArrayDeque<>();
            Deque<TreeNode> next = new ArrayDeque<>();
            
            if(root == null)
            {
                return res;
            }
            
            curr.offer(root);
            while(! curr.isEmpty())
            {
                TreeNode temp = curr.poll();
                
                if(temp.left != null)
                {
                    next.offer(temp.left);
                }
                if(temp.right != null)
                {
                    next.offer(temp.right);
                }
                
                list.add(temp.val);
                
                if(curr.isEmpty())
                {
                    res.add(list);
                    list = new ArrayList<>();
                    curr = next;
                    next = new ArrayDeque<>();
                }
            }
            
            List<List<Integer>> reverseRes = new ArrayList<>();
            for(int i = res.size()-1; i >= 0; i --)
            {
                reverseRes.add(res.get(i));
            }
            return reverseRes;
        }
    }
    

      

  • 相关阅读:
    ASP.NET多线程下使用HttpContext.Current为null解决方案
    Pig性能优化
    重温设计模式之前言
    MVC4+WebApi+Redis Session共享练习(下)
    C#中对象的输出
    CYQ.Data 支持WPF相关的数据控件绑定.Net获取iis版本
    java版微信公众平台自定义菜单创建代码实现
    android动画特效之解决解决移动后闪烁现象,解决输入法弹出后位置回复原状,解决两个动画叠加
    VMware 11安装Mac OS X 10.10 及安装Mac Vmware Tools(超详细),以及动态调整虚拟机硬盘大小
    三个API:开启、关闭、关闭线程重定向
  • 原文地址:https://www.cnblogs.com/masterlibin/p/5910064.html
Copyright © 2020-2023  润新知