說道遍歷二叉樹,我們很容易就會想到按照前序中序後序以及按層來遍歷二叉樹。
這篇博客主要是記錄一下按層來遍歷二叉樹的方法。
這個二叉樹按照層來遍歷的結果是
二叉樹的遍歷方法中,很多人最先想到的就是用遞歸的方法進行遍歷。二叉樹按層遍歷也同樣可以使用遞歸的方法進行遍歷,這種方法有兩個要點:1.要記錄當前遍歷的層數 2.每次遞歸的過程中判斷該層是否已經遍歷過
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
上面是二叉樹的結構定義。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//定義一個存放結果的數據結構
List<List<Integer>> res = new ArrayList<>();
if (null == root) {
return res;
}
//用來記錄層數的計數器
int count = 0;
levelOrder(root,res,count);
return res;
}
public void levelOrder(TreeNode root,List<List<Integer>> res,int count) {
//如果遍歷的這個節點是空的則不需要操作和記錄
if (null == root) {
return;
}
List<Integer> list;
if (count >= res.size()) {//如果是沒有遍歷過的層,則創建新的List存放節點
list = new ArrayList<Integer>();
//把這個新建的List放入存放結果的數據結構中
res.add(list);
} else {//如果是正在遍歷的層則從結果集中取出存放這層節點的List
list = res.get(count);
}
//將節點的值放入List
list.add(root.val);
//遞歸地繼續去按照從左至右的遍歷節點的下一層
levelOrder(root.left,res,count+1);
levelOrder(root.right,res,count+1);
}
}
按層遍歷二叉樹還可以藉助隊列來完成。這個方法的重點是每次將正在遍歷的節點從隊列中取出,並節點左右子樹放入隊列。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (null == root) {
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
//記錄遍歷層的節點的數量
int count = queue.size();
List<Integer> list = new ArrayList<>();
while (count > 0) {
//將節點從隊列中取出
TreeNode temp = queue.poll();
list.add(temp.val);
//如果節點存在左右子樹,則將左右子樹放入隊列中
if (null != temp.left) {
queue.add(temp.left);
}
if (null != temp.right) {
queue.add(temp.right);
}
//完成該節點的遍歷,則計數器-1
count--;
}
res.add(list);
}
return res;
}
}