1. 程式人生 > 實用技巧 >103.二叉樹的鋸齒形層序遍歷

103.二叉樹的鋸齒形層序遍歷

題目

給定一個二叉樹,返回其節點值的鋸齒形層序遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。

例如:

給定二叉樹[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