劍指offer_22:從上往下列印二叉樹
阿新 • • 發佈:2020-12-19
從上到下打印出二叉樹的每個節點,同一層的節點按照從左到右的順序列印。
例如:
給定二叉樹: [3,9,20,null,null,15,7],
返回:
[3,9,20,15,7]
提示:
節點總數 <= 1000
BFS
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public int[] levelOrder(TreeNode root) { if(root==null) return new int[0]; Queue<TreeNode> queue=new LinkedList<>(); List<Integer> list=new ArrayList<>(); queue.offer(root); while(!queue.isEmpty()){ TreeNode node=queue.poll(); list.add(node.val); if(node.left!=null) queue.offer(node.left); if(node.right!=null) queue.offer(node.right); } int[] res=new int[list.size()]; for(int i=0;i<list.size();i++){ res[i]=list.get(i); } return res; } }
提高1:
從上到下按層列印二叉樹,同一層的節點按從左到右的順序列印,每一層列印到一行。
例如:
給定二叉樹: [3,9,20,null,null,15,7],
返回其層次遍歷結果:
[
[3],
[9,20],
[15,7]
]
提示:
節點總數 <= 1000
1、BFS
/** * 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(root==null) return res; Queue<TreeNode> queue=new LinkedList<>(); queue.offer(root); while(!queue.isEmpty()){ List<Integer> list=new ArrayList<>(); int size=queue.size(); for(int i=0;i<size;i++){ TreeNode node=queue.poll(); list.add(node.val); if(node.left!=null) queue.offer(node.left); if(node.right!=null) queue.offer(node.right); } res.add(list); } return res; } }
2、DFS
/** * 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<>(); levelOrder(root,res,0); return res; } public void levelOrder(TreeNode root,List<List<Integer>> res,int level){ if(root==null) return; if(level>=res.size()){ res.add(new ArrayList<Integer>()); } res.get(level).add(root.val); if(root.left!=null) levelOrder(root.left,res,level+1); if(root.right!=null) levelOrder(root.right,res,level+1); } }
提高2:
請實現一個函式按照之字形順序列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右到左的順序列印,第三行再按照從左到右的順序列印,其他行以此類推。
例如:
給定二叉樹: [3,9,20,null,null,15,7],
返回其層次遍歷結果:
[
[3],
[20,9],
[15,7]
]
提示:
節點總數 <= 1000
/**
* 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(root==null) return res;
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
int level=1;
while(!queue.isEmpty()){
LinkedList<Integer> list=new LinkedList<>();
int size=queue.size();
for(int i=0;i<size;i++){
TreeNode node=queue.poll();
if(level%2!=0){
list.addLast(node.val);
}else{
list.addFirst(node.val);
}
if(node.left!=null) queue.offer(node.left);
if(node.right!=null) queue.offer(node.right);
}
level++;
res.add(list);
}
return res;
}
}