2020_9_6 每日一题 二叉树的层次遍历 II

本文探讨了二叉树的自底向上层次遍历算法,通过三种方法实现:深度优先搜索、广度优先搜索及改进版广度优先搜索。深度优先搜索采用递归方式,广度优先搜索利用队列进行层级遍历,最后介绍了一种无需记录层级和反转结果的高效方法。
摘要由CSDN通过智能技术生成

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

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

      3   
     / \   
    9   20
       /  \    
      15   7 

返回其自底向上的层次遍历为:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

要么广度优先搜索要么treeWalk,感觉treewWalk实现起来简单一点:

class Solution {
	private void treeWalk(TreeNode node, List<List<Integer>> ans, int level) {
		if(node == null)
			return;
		if(ans.size() - 1  < level) {
			ans.add(new LinkedList<Integer>());
		}
		ans.get(level).add(node.val);
		
		treeWalk(node.left, ans, level + 1);
		treeWalk(node.right, ans, level + 1);
	}
	
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        treeWalk(root, ans, 0);
        Collections.reverse(ans);
        return ans;
    }
}

缺点可能是最后需要reverse一遍,以及在前进过程中需要记录当前是第几层。

也可以用深度或者广度优先。深度优先搜索实现起来的感觉应该跟treewalk差不多,不实现了,实现了一下广度优先搜索,仍然采用记录当前层级最后反转的思路:

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        
        LinkedList<TreeNode> nodeQueue = new LinkedList<TreeNode>();
        LinkedList<Integer> levelQueue = new LinkedList<Integer>();
        
        nodeQueue.add(root);
        levelQueue.add(0);
        
        while(!nodeQueue.isEmpty()) {
        	int level = levelQueue.pollFirst();
        	TreeNode node = nodeQueue.pollFirst();
        	if(node == null)
        		continue;
        	if(ans.size() <= level) {
        		ans.add(new LinkedList<Integer>());
        	}
        	ans.get(level).add(node.val);
        	nodeQueue.add(node.left);
        	nodeQueue.add(node.right);
        	levelQueue.add(level + 1);
        	levelQueue.add(level + 1);
        }
        Collections.reverse(ans);
        return ans;
    }
}

看了一下题解,是可以逐层处理的,那样就不需要记录层级和最后反转了:

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {

        List<List<Integer>> ans = new LinkedList<List<Integer>>();
        if(root == null)
            return ans;
        LinkedList<TreeNode> nodeQueue = new LinkedList<TreeNode>();
        nodeQueue.add(root);
        
        while(!nodeQueue.isEmpty()) {
        	
        	List<Integer> cur = new LinkedList<Integer>();
        	int curLevelSize = nodeQueue.size();
        	for(int i = 0; i < curLevelSize; ++i) {
        		TreeNode node = nodeQueue.pollFirst();
        		cur.add(node.val);
                if(node.left != null)
        		    nodeQueue.add(node.left);
                if(node.right != null)
        		    nodeQueue.add(node.right);
        	}
        	ans.add(0, cur);
        }

        return ans;
    }
}

优秀啊题解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值