二叉樹的層序遍歷 II
題目描述:給定一個二叉樹,返回其節點值自底向上的層序遍歷。 (即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷)
示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:層序遍歷
- 首先,如果根節點為空,直接返回空的結果集。
如果根節點不為空,通過佇列來遍歷每一層的節點,具體處理過程如下:
- 首先將根節點放入佇列;
- 遍歷佇列中當前的節點數,即為當前層的結果,然後再將當前層節點的左右非空子節點放入到佇列中 ;
- 然後繼續遍歷佇列中下一層的節點,直到佇列為空位置。
- 這樣得到的結果是從上往下層序遍歷的結果, 最後呼叫
Collections.reverse(result);
這個方法,將得到的結果集逆序排列,即可得到自底向上的層序遍歷。
import com.kaesar.leetcode.TreeNode;
import java.util.*;
public class LeetCode_107 {
/**
* 層序遍歷
*
* @param root
* @return
*/
public static List<List<Integer>> levelOrderBottom(TreeNode root) {
// 初始化結果集
List<List<Integer>> result = new ArrayList<>();
// 如果根節點為空,直接返回result
if (root == null) {
return result;
}
// 用一個佇列存每一層的節點
Queue<TreeNode> nodes = new LinkedList<>();
nodes.add(root);
// 遍歷每一層的節點,將節點的值放入list中
while (!nodes.isEmpty()) {
int count = nodes.size();
List<Integer> curLevel = new ArrayList<>();
while (count > 0) {
TreeNode cur = nodes.poll();
curLevel.add(cur.val);
if (cur.left != null) {
nodes.add(cur.left);
}
if (cur.right != null) {
nodes.add(cur.right);
}
count--;
}
result.add(curLevel);
}
// 最後將得到的結果集逆序,得到從最下層 -> 最上層的遍歷結果
Collections.reverse(result);
return result;
}
public static void main(String[] args) {
// 測試用例
TreeNode root = new TreeNode(3);
root.left = new TreeNode(9);
root.right = new TreeNode(20);
root.right.left = new TreeNode(15);
root.right.right = new TreeNode(7);
for (List<Integer> integers : levelOrderBottom(root)) {
for (Integer integer : integers) {
System.out.print(integer + " ");
}
System.out.println();
}
}
}
【每日寄語】 多少事,從來急,天地轉,光陰迫,一萬年太久,只爭朝夕。