数据结构和算法实践-树-LeetCode107-二叉树的层序遍历Ⅱ
题目
给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)。
输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]
My Thought
题目给定的是通过二叉树的层序去遍历,结合示例,两个大的数据结构相关的设计:
1、整体的数据结构,用queue的方式先进后出,poll每一层的节点的时候去addqueue的left和right
2、用linklist中的add方法,去接收所有的List
详细编程步骤:
一、通过root节点遍历每一层结构
二、每一层结构要带出left和right
2.1、把root先压入队列
2.2、弹出root,再把root的left和right依次压入队列中
2.3、弹出root.left,把left的root.left.left和root.left.right压入队列
2.4、弹出root.right,把right的root.right.left和root.right.right压入队列
2.5、反复执行2.3和2.4
2.6、每一次循环都用LinkList来接受,因为LinkList的add这个API源码是会走linkLast,linkBefore方法
代码示例
JAVA-8
java
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> result = new LinkedList<>();
if (root == null) {
return result;
}
Queue<TreeNode> treeNodeQueue = new LinkedList<>();
treeNodeQueue.add(root);
while (!treeNodeQueue.isEmpty()) {
int size = treeNodeQueue.size();
List<Integer> listNode = new LinkedList<>();
for (int i = 0; i < size; i++) {
TreeNode treeNode = treeNodeQueue.poll();
listNode.add(treeNode.val);
if (treeNode.left != null) {
treeNodeQueue.add(treeNode.left);
}
if (treeNode.right != null) {
treeNodeQueue.add(treeNode.right);
}
}
result.add(0,listNode);
}
return result;
}