103.二叉樹的鋸齒形層序遍歷
阿新 • • 發佈:2020-12-27
題目
給定一個二叉樹,返回其節點值的鋸齒形層序遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。
例如:
給定二叉樹[3,9,20,null,null,15,7],
返回鋸齒形層序遍歷如下:
[
[3],
[20,9],
[15,7]
]
分析
實際上就是層序遍歷的問題,類似問題有求二叉樹的層序遍歷。將每層的遍歷結果裝入List中,偶數層的遍歷結果最後反轉過來即可。使用LinkedList儲存資訊,LinkedList實現了介面Queue,可以當佇列用。關鍵點在於如何將不同層的節點區分開來。這裡我們用一個變數n來記錄每一層的節點個數,遍歷完一層的n個節點後再一次執行while迴圈
程式碼
class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { LinkedList<TreeNode> list=new LinkedList<>(); List<List<Integer>> res=new ArrayList<>(); if(root==null) return res; list.add(root); while(list.size()!=0){ int n=list.size();//每層的節點個數 ArrayList<Integer> level=new ArrayList<>(); for(int i=0;i<n;++i){ TreeNode cur=list.removeFirst(); if(cur.left!=null) list.add(cur.left); if(cur.right!=null) list.add(cur.right); level.add(cur.val); } res.add(level); } //將相應層的遍歷結果反轉 for(int i=0;i<res.size();i++){ if(i%2==1) { List<Integer> temp=res.get(i); Collections.reverse(temp); res.set(i,temp); } } return res; } }
原題連結:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal