LeetCode 二叉樹的層次遍歷
阿新 • • 發佈:2019-12-31
第102題
給定一個二叉樹,返回其按層次遍歷的節點值。 (即逐層地,從左到右訪問所有節點)。
例如:
給定二叉樹: [3,9,20,null,15,7],3
/ \
9 20
/ \
15 7
返回其層次遍歷結果:
[
[3],[9,20],[15,7]
]
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
複製程式碼
如何遍歷一棵樹
有兩種通用的遍歷樹的策略:
- 深度優先搜尋(DFS)
在這個策略中,我們採用深度作為優先順序,以便從跟開始一直到達某個確定的葉子,然後再返回根到達另一個分支。
深度優先搜尋策略又可以根據根節點、左孩子和右孩子的相對順序被細分為先序遍歷,中序遍歷和後序遍歷。
- 寬度優先搜尋(BFS)
我們按照高度順序一層一層的訪問整棵樹,高層次的節點將會比低層次的節點先被訪問到。
解題思路
方法 1:迭代+佇列
我們將樹上頂點按照層次依次放入佇列結構中,佇列中元素滿足 FIFO(先進先出)的原則。使用 Queue 介面中的 LinkedList實現。
演演算法實現如下:
- 初始化佇列只包含一個節點 root。
- 初始一個List變數result,用來做返回結果 當佇列非空的時候,迴圈開始:
- 計算當前層有多少個元素:等於佇列的長度
- 初始一個List變數subResult,用來存當前層的節點值
- 將這些元素從佇列中彈出,將他們的值加入subResult列表中
- 將他們的孩子節點作為下一層壓入佇列中
- 進入下一層,將當前層subResult add到result中
/**
* 廣搜+佇列
*/
class Solution102_1 {
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null)
return new ArrayList<>();
return BFS(root);
}
List<List<Integer>> BFS(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
List<List<Integer>> result = new LinkedList<>();
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> subResult = new LinkedList<>();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
subResult.add(node.val);
}
result.add(subResult);
}
return result;
}
}
複製程式碼
方法 2:遞迴
首先確認樹非空,然後呼叫遞迴函式 DFS(node,result,level),引數是當前節點、返回結果列表、節點的層次。
演演算法實現如下:
- result列表的長度小於level,為result add一個新列表
- 為當前層的result列表add節點值,即result.get(level - 1).add(node.val)
- 如果有左孩子,呼叫DFS(node.left,level + 1),進入遞迴
- 如果有右孩子,呼叫DFS(node.right,level + 1),進入遞迴
/**
* 深搜+遞迴
*/
class Solution102_2 {
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) return new ArrayList<>();
List<List<Integer>> result = new LinkedList<>();
DFS(root,1);
return result;
}
void DFS(TreeNode node,List<List<Integer>> result,int level) {
if (result.size() < level) {
result.add(new LinkedList<>());
}
result.get(level - 1).add(node.val);
if (node.left != null) {
DFS(node.left,level + 1);
}
if (node.right != null) {
DFS(node.right,level + 1);
}
}
}
複製程式碼
完整程式碼
public class Sub102 {
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);
Solution102_2 solution = new Solution102_2();
List<List<Integer>> list = solution.levelOrder(root);
for (List<Integer> subList : list) {
System.out.println(subList.toString());
}
}
}
/**
* 廣搜+佇列
*/
class Solution102_1 {
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null)
return new ArrayList<>();
return BFS(root);
}
List<List<Integer>> BFS(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
List<List<Integer>> result = new LinkedList<>();
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> subResult = new LinkedList<>();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
subResult.add(node.val);
}
result.add(subResult);
}
return result;
}
}
/**
* 深搜+遞迴
*/
class Solution102_2 {
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) return new ArrayList<>();
List<List<Integer>> result = new LinkedList<>();
DFS(root,level + 1);
}
}
}
複製程式碼