《leetCode》:Binary Tree Level Order Traversal II
来源:互联网 发布:浙师大行知学院迎新网 编辑:程序博客网 时间:2024/05/21 21:33
题目
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,#,#,15,7}, 3 / \ 9 20 / \ 15 7return its bottom-up level order traversal as:[ [15,7], [9,20], [3]]
思路
思路比较简单,就是利用两个队列将每层结果进行保存,然后保存到最后结果即可
实现代码如下:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Solution { /* * 思路:借助于两个队列来完成即可 * */ public List<List<Integer>> levelOrderBottom(TreeNode root) { //先按层从左到右的获取节点值 Stack<List<Integer>> leverOrderUptoBottomRes=leverOrderBottomHelper(root); //将leverOrderUptoBottomRes翻转即可 return reversalResult(leverOrderUptoBottomRes); } private List<List<Integer>> reversalResult( Stack<List<Integer>> leverOrderUptoBottomRes) { List<List<Integer>> temp=new ArrayList<List<Integer>>(); while(!leverOrderUptoBottomRes.isEmpty()){ List<Integer> list=leverOrderUptoBottomRes.pop(); if(!list.isEmpty()){ temp.add(list); } } return temp; } private Stack<List<Integer>> leverOrderBottomHelper(TreeNode root) { Stack<List<Integer>> res=new Stack<List<Integer>>(); if(root==null){ return res; } ArrayDeque<TreeNode> q1=new ArrayDeque<TreeNode>(); ArrayDeque<TreeNode> q2=new ArrayDeque<TreeNode>(); //将头结点元素放入q1队列中 q1.add(root); List<Integer> firstNodeValue=new ArrayList<Integer>(); firstNodeValue.add(root.val); res.push(firstNodeValue);//先将第一个结点保存在结果中 while(!(q1.isEmpty()&&q2.isEmpty())){ while(!q1.isEmpty()){ TreeNode node=q1.poll();//获取队首元素 if(node.left!=null){ q2.add(node.left); } if(node.right!=null){ q2.add(node.right); } } List<Integer> leverRes=new ArrayList<Integer>(); while(!q2.isEmpty()){ TreeNode tempNode=q2.poll(); leverRes.add(tempNode.val); q1.add(tempNode); } res.push(leverRes); } return res; }}
总结
在上面的实现过程中,遇到了一些细节的问题,比如说,队列的选取,刚开始选择的是PriorityQueue,然而此队列是将元素从小到大进行保存的队列,因此这不是我需要的。
还有就是:在reversalResult函数中需要对弹出的栈顶元素进行非空判断才会过滤掉那些空结果(即[ ]),如下:
不知道原因是什么。反正完成这个题目出现了很多细节问题。
if(!list.isEmpty()){ temp.add(list); }
补充:找到了上面的问题的原因所在,并且由于存在方法来使得List的元素进行翻转,因此就有了如下的代码
/* * 思路:借助于两个队列来完成即可 * */ public List<List<Integer>> levelOrderBottom(TreeNode root) { //先按层从左到右的获取节点值 List<List<Integer>> leverOrderUptoBottomRes=leverOrderBottomHelper(root); //将leverOrderUptoBottomRes翻转即可 Collections.reverse(leverOrderUptoBottomRes); return leverOrderUptoBottomRes; } private List<List<Integer>> leverOrderBottomHelper(TreeNode root) { List<List<Integer>> res=new Stack<List<Integer>>(); if(root==null){ return res; } ArrayDeque<TreeNode> q1=new ArrayDeque<TreeNode>(); ArrayDeque<TreeNode> q2=new ArrayDeque<TreeNode>(); //将头结点元素放入q1队列中 q1.add(root); List<Integer> firstNodeValue=new ArrayList<Integer>(); firstNodeValue.add(root.val); res.add(firstNodeValue);//先将第一个结点保存在结果中 while(!(q1.isEmpty()&&q2.isEmpty())){ while(!q1.isEmpty()){ TreeNode node=q1.poll();//获取队首元素 if(node.left!=null){ q2.add(node.left); } if(node.right!=null){ q2.add(node.right); } } List<Integer> leverRes=new ArrayList<Integer>(); while(!q2.isEmpty()){ TreeNode tempNode=q2.poll(); leverRes.add(tempNode.val); q1.add(tempNode); } //问题再这里,如果leverRes为空,则说明此结果不能被加入最后的结果中去 if(!leverRes.isEmpty()){ res.add(leverRes); } } return res; }}
1 0
- LeetCode: Binary Tree Level Order Traversal II
- [LeetCode]Binary Tree Level Order Traversal II
- LeetCode Binary Tree Level Order Traversal II
- [Leetcode] Binary Tree Level Order Traversal II
- LeetCode Binary Tree Level Order Traversal II
- [LeetCode] Binary Tree Level Order Traversal II
- 【leetcode】Binary Tree Level Order Traversal II
- [LeetCode]Binary Tree Level Order Traversal II
- [Leetcode]Binary Tree Level Order Traversal II
- [leetcode]Binary Tree Level Order Traversal II
- LeetCode-Binary Tree Level Order Traversal II
- LeetCode - Binary Tree Level Order Traversal II
- [LeetCode] Binary Tree Level Order Traversal II
- LeetCode | Binary Tree Level Order Traversal II
- LeetCode - Binary Tree Level Order Traversal II
- 【leetcode】Binary Tree Level Order Traversal II
- 【LeetCode】Binary Tree Level Order Traversal II
- [LeetCode] Binary Tree Level Order Traversal II
- android学习 - 高德地图api定位基础(1)
- Android Activity 之 Intent 数据传递学习笔记
- 如何获取两个字符串中两个相同的字符
- Tachyon更名为 Alluxio,并发布1.0版本
- 20160212.CCPP体系详解(0022天)
- 《leetCode》:Binary Tree Level Order Traversal II
- leetcode 16. 3Sum Closest
- 【SSH 1】SSH框架的基本理解
- Copy List with Random Pointer
- 三层总结
- Project Perfect让Swift在服务器端跑起来-Perfect in Visual Studio Code (四)
- cocos create 系列 【一】 初识cocos creator
- elgnairTs'lacsaP.118
- 禁止scrollView滚动