二叉树层次遍历

层次遍历二叉树,每一次储存在list中,结果按从叶子层到根,从左到右的顺序存储

 

代码一:

class Solution {
        public List<List<Integer>> levelOrderBottom(TreeNode root) {
            List<List<Integer>> lists = new ArrayList<>();
            func(lists, 0, root); //遍历
            //逆转List
            for (int i = 0, j = lists.size() - 1; i < j; i++, j--) {
                List<Integer> temp = lists.get(i);
                lists.set(i, lists.get(j));
                lists.set(j, temp);
            }
            return lists;
        }
        //相当于在先序的基础上改进,level是每个node所在的层次。
        //如果lists大小和level相等,说明开始新一层的存储。
        //如果不等,则直接把值存入相应层次的list中。
        private void func(List<List<Integer>> lists, int level, TreeNode root) {
            if (root == null) {
                return;
            }
            if (lists.size() == level) {
                //相等,新建该层的list并将node存入
                List<Integer> list = new ArrayList<>();
                list.add(root.val);
                lists.add(list);
            } else {
                //不等,说明list已有,存入即可
                lists.get(level).add(root.val);
            }
            func(lists, level + 1, root.left);
            func(lists, level + 1, root.right);
        }
    }

代码二:队列:

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        Queue<TreeNode> q = new ArrayDeque<TreeNode>();
        if(root==null)
            return res;
		TreeNode left = null;
		TreeNode right = null;
		TreeNode temp = root;
		q.add(root);
		int size = 1;
		while(true){
			size = q.size(); //只在这里更新size的值
			ArrayList<Integer> inner = new ArrayList<Integer>();
			while(size!=0){
				temp = q.poll();
				inner.add(temp.val);
				size--;
				left = temp.left;
				right = temp.right;
                //虽然有把节点添加到队列中,但是并没有更新size的值,所以该层
                //while相当于是遍历每层!
				if(left!=null)
					q.add(left);
				if(right!=null)
					q.add(right);
			}
            res.add(inner);
			if(q.size()==0)
				break;
		}
        Collections.reverse(res);
		return res;
    }
}

其他思路:设置first和last标记node,来找出每层的开始结束位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值