二叉树的层次遍历_Java

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

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

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

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

解题思路:
提供两种实现方案:
(1) 广度优先搜索
(2) 深度优先搜索

第一种方案的解题思路:
一层一层向下遍历广度优先搜索,存储当前层的所有节点值,返回。

代码实现:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> list=new ArrayList<>();
		//代码的鲁棒性
		if(root==null) {
			return list;
		}
		//用队列进行按层打印,将每一层节点的左孩子和右孩子放在队列的最后面
		Deque<TreeNode> deq=new LinkedList<TreeNode>();
		deq.add(root);
		while(!deq.isEmpty()) {
			//存储当前层的节点值
			List<Integer> al=new ArrayList<>();
			//当前层节点的个数
			int size=deq.size();
			for(int i=0;i<size;i++) {
				TreeNode node= deq.poll();
				al.add(node.val);
				//加入该节点的左孩子
				if(node.left!=null) {
					deq.add(node.left);
				}
				//加入该节点的右孩子
				if(node.right!=null) {
					deq.add(node.right);
				}
			}
			list.add(al);
		}
		return list;
    }
}

第二种解题思路:深度优先搜素(力扣官方解题思路)
递归算法
最简单的解法就是递归,首先确认树非空,然后调用递归函数 helper(node, level),参数是当前节点和节点的层次。程序过程如下:
输出列表称为 levels,当前最高层数就是列表的长度 len(levels)。比较访问节点所在的层次 level 和当前最高层次 len(levels) 的大小,如果前者更大就向 levels 添加一个空列表。
将当前节点插入到对应层的列表 levels[level] 中。
递归非空的孩子节点:helper(node.left / node.right, level + 1)。

代码实现:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    List<List<Integer>> list=new ArrayList<>();
	public List<List<Integer>> levelOrder(TreeNode root) {
		if(root==null) {
			return list;
		}
		//提供一个方法:传进去的参数为当前节点和当前节点所处的二叉树深度(level)
		helper(root,0);
		return list;
    }
	private void helper(TreeNode node, int level) {
		//当前层的level=list.size()时,说明深度有增加了,所以要添加此时的层存储容器
		if(list.size()==level) {
			list.add(new ArrayList<Integer>());
		}
		//在深度相同的位置,加入元素
		list.get(level).add(node.val);
		//左孩子,level+1
		if(node.left!=null) {
			helper(node.left,level+1);
		}
		//右孩子,level+1
		if(node.right!=null) {
			helper(node.right,level+1);
		}
	}
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值