1、题目描述:
2、思路:
方式1:层序遍历需要使用队列,每次让根节点入队,然后出队,和102题差不多,不过最后需要反转一下。
方式2:添加到集合中时,每次从头部添加
3、代码实现:
(1)Node节点类
public class Node {
int val;
Node left;
Node right;
Node(int val){
this.val = val;
}
}
(2)二叉树类Solution
class Solution {
public Node root;
public void setRoot(Node root) {
this.root = root;
}
public List<List<Integer>> levelOrderBottom(Node root) {
List<List<Integer>> list = new ArrayList<>();
if(root==null){
return list;
}
Queue<Node> queue = new LinkedList();
//先将根节点放入队列
queue.add(root);
//while循环会保证队列中只要有数据,就应该将其取出
while(!queue.isEmpty()) {
List<Integer> tempList = new ArrayList<>();
int size = queue.size();
//for循环为了让一层的节点能够放到一个tempList中
for (int i = 0; i <size; i++) {
//将根节点取出
Node node = queue.poll();
tempList.add(node.val);
//将左子节点放入队列
if (node.left != null) {
queue.add(node.left);
}
//将右子节点放入队列
if (node.right != null) {
queue.add(node.right);
}
}
list.add(tempList);
}
Collections.reverse(list);
return list;
}
}
(3)测试类Main
public class Main {
public static void main(String[] args) {
Node node = new Node(3);
Node node1 = new Node(9);
Node node2 = new Node(20);
Node node3 = new Node(15);
Node node4 = new Node(7);
Solution binaryTree = new Solution();
binaryTree.setRoot(node);
node.left = node1;
node.right = node2;
node2.left = node3;
node2.right = node4;
List<List<Integer>> list = binaryTree.levelOrderBottom(node);
System.out.println(list);
}
}
4、LeetCode解答:
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
if(root==null){
return list;
}
Queue<TreeNode> queue = new LinkedList();
queue.add(root);
while(!queue.isEmpty()){
List<Integer> tempList = new ArrayList<>();
int size = queue.size();
for(int i=0;i<size;i++){
TreeNode node = queue.poll();
tempList.add(node.val);
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
list.add(tempList);
// list.add(0,tempList);
}
Collections.reverse(list);
return list;
}
}