leetcode 107 Binary Tree Level Order Traversal II 从下到上的层次遍历

肯定要知道深度的,我不明白这个咋就变成easy的难度了。

题目如下:

Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).

For example:
Given binary tree [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

 

return its bottom-up level order traversal as:

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

我的解决办法:
 

package test;

import java.util.ArrayList;
import java.util.List;

public class LC107Try1
{
	public List<List<Integer>> levelOrderBottom(TreeNode root)
	{
		List<List<Integer>> list= new ArrayList<List<Integer>>();
		int[] dp=new int[1];
		getPass(root,list,0,dp);
		return list;

	}
	
	public void getPass(TreeNode root,List<List<Integer>> list,int level,int[] dp){
		if(root==null){
			return;
		}
		if(list.size()<level+1){
			list.add(0,new ArrayList<Integer>());
		}
		if(level>dp[0]){
			dp[0]=level;
		}
		list.get(dp[0]-level).add(root.val);
		getPass(root.left,list,level+1,dp);
		getPass(root.right,list,level+1,dp);
		
	}

}

第二种解决办法:其实我没想到他更快。

package test;

import java.util.ArrayList;
import java.util.List;

public class LC107Try2
{
	public List<List<Integer>> levelOrderBottom(TreeNode root)
	{
		List<List<Integer>> res = new ArrayList<List<Integer>>();
		int d = depth(root, 0);
		for (int i = 0; i < d; i++)
		{
			res.add(new ArrayList());
		}
		traverse(root, res, d);
		// System.out.print(d);
		return res;
	}

	private int depth(TreeNode root, int d)
	{
		if (root == null)
			return d;
		d++;
		int l1 = depth(root.left, d);
		int l2 = depth(root.right, d);
		return l1 > l2 ? l1 : l2;
	}

	private void traverse(TreeNode root, List<List<Integer>> res, int d)
	{
		if (root == null)
			return;
		traverse(root.left, res, d - 1);
		traverse(root.right, res, d - 1);
		res.get(d - 1).add(root.val);
	}

}

 

 public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> ret=new ArrayList<>();
        if(root==null){
            return ret;
        }
        Deque<TreeNode> stack=new LinkedList<>();
        stack.push(root);
        while(stack.size()>0){
            int size= stack.size();
            List<Integer> list=new ArrayList<>();
            for(int i=0;i<size;i++){
                TreeNode p=stack.pollLast();
                list.add(p.val);
                if(p.left!=null){
                    stack.push(p.left);
                }
                if(p.right!=null){
                    stack.push(p.right);
                }
            }
            ret.add(0,list);

        }

        return ret;
    }

 

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> ret=new ArrayList<>();
        if(root==null){
            return ret;
        }
        getPass(root,1,ret);
        return ret;
    }

     public void getPass(TreeNode p,int level,List<List<Integer>> ret){
        if(ret.size()<level){
            List<Integer> list =new ArrayList<>();
            ret.add(0,list);
        }
        ret.get(ret.size()-level).add(p.val);

        if(p.left!=null){
            getPass(p.left,level+1,ret);
        }
        if(p.right!=null){
            getPass(p.right,level+1,ret);
        }

    }
   
}

哈哈

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值