算法
概:这波是一个简单难度的题,至于为什么要记录下来,不是因为他的思路有多难,只是在实现上有一定的麻烦的地方。
来源:力扣(LeetCode)
链接:二叉树的层次遍历II
题目
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
范例
例如:
给定二叉树 [3,9,20,null,null,15,7],
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
解题思路
- 这道题要求二叉树分层遍历,把每一层的数值从左到右连成一个list串起来,然后最终从下往上的顺序放到一个list中返回,我用的方法是在二叉树的遍历中统计当前节点所在深度,然后用深度作为key,深度对应的层次的list作为值,绑定到map中,遍历到某个节点的时候,检索map中是否有当前深度的key,有就将当前数据添加到这层的list中,没有则新建。最终将map中的list导出到一个新的list中即可。
Java代码
class Solution {
Map<Integer,List<Integer>> map = new HashMap<Integer,List<Integer>>();
int length = 0;
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
BL(root,1);
for(int i =length;i>0;i--)
{
list.add(map.get(i));
}
return list;
}
public void BL(TreeNode root,int a)
{
if(root!=null)
{
TJ(a,root.val);
BL(root.left,a+1);
BL(root.right,a+1);
}
}
public void TJ(int a,int va)
{
if(map.get(a)!=null)
{
map.get(a).add(va);
}
else
{
List<Integer> c = new ArrayList<Integer>();
c.add(va);
map.put(a,c);
if(a>length)
{
length = a;
}
}
}
}