• 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;
        }
    }
    

      

  • 相关阅读:
    ADO数据库操作方式
    C++ 连接Oracle
    ADO 动态链接数据库
    C++连接Oracle之OCCI(windows)
    App测试经验分享之登录注册
    使用dpkg时,提示:dpkg:处理软件包XXX时出错
    性能测试指标及常用的监控工具[转]

    JMeter ——Test fragment
    JMeter设置Http代理对web或者app进行录制
  • 原文地址:https://www.cnblogs.com/masterlibin/p/5910064.html
Copyright © 2020-2023  润新知