102. 二叉树的层次遍历

本文介绍了一种实现二叉树层序遍历的方法,通过使用队列和特殊标记来区分不同层级的节点,同时解决了遍历过程中的一些常见问题。

层序遍历二叉树,并且还要分层输出。

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]
]

遇到了几个坑,

1。怎么分层,我是用null这个标记,当第一次在root入队后,加null,在出队遇到null的时候,正好下面一层已经全部入队,再加一个null标记,用来区分这一层

2;因为要把List,插入list中,但是我忘了list只是引用,我再clear list之后,插入list中的小list也会被清空。所以导致输出结果是全空。解决的方法,是在插入之前创建一个新的对象,赋值之后再插入。

太坑了,搞了好久。。

public static void main(String[] args) {
		TreeNode root=new TreeNode(3);
		TreeNode L2L=new TreeNode(9);
		TreeNode L2R=new TreeNode(20);
		TreeNode L3L=new TreeNode(15);
		TreeNode L3R=new TreeNode(7);
		root.left=L2L;
		root.right=L2R;
		L2R.left=L3L;
		L2R.right=L3R;
		//levelOrder(root);
		System.out.println(levelOrder(root));
	}
	//二叉树的层数遍历,原理是队列,如果要分层,可以加一个标记,比如null
    public static List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> LLs =new ArrayList<List<Integer>>();
        if(root==null){
        	return LLs;
        }
        List<Integer> ls=new ArrayList<Integer>();
        LinkedList<TreeNode> q=new LinkedList<TreeNode>();
        q.addLast(root);
        //可以画出规律,就是这个null的标记的用法,遇到null,说明当前层出队完成,然后再入一个null,正好是下一层入完队之后
        q.addLast(null);
        while(q.size()>0){
            TreeNode T=q.removeFirst();
            if(T==null){
            	//因为ls是一个引用,所以后面要clear他的时候,就要清掉引用的值,所以,用一个新的对象拿出来
            	List<Integer> L=new ArrayList<Integer>();
                for(int i=0;i<ls.size();i++){
                    L.add(ls.get(i));
                }
                LLs.add(L);
                //System.out.println(LLs);
               ls.clear();
                if(q.size()==0){
                    break;
                }
                q.addLast(null);
                continue;
            }else{
                
                ls.add(T.val);
                
            }
            if(T.left!=null){
              q.addLast(T.left); 
            }
            if(T.right!=null){
              q.addLast(T.right);  
            }
        } 
        return LLs;
    }
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值