[LeetCode - BFS & Stack] 103. Binary Tree Zigzag Level Order Traversal

xiaoxiao2021-02-28  115

1 题目

Given a binary tree, return the zigzag level order traversal of its nodes’ values. (ie, from left to right, then right to left for the next level and alternate between). For example: Given binary tree [3,9,20,null,null,15,7],

3 / \ 9 20 / \ 15 7

return its zigzag level order traversal as:

[ [3], [20,9], [15,7] ]

2 分析

我的思路是修改树的BFS算法,使用两个栈,一个从左到右,一个从右到左存储遍历到的节点, 当节点入栈的同时,将节点中的数值存储到对应的结果数组中。 时间复杂度是 O(n) ,但是空间复杂度是 O(2n)

3 代码

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> result = new ArrayList<>(); List<Integer> tmpRes = new ArrayList<>(); LinkedList<TreeNode> L2R = new LinkedList<>(); LinkedList<TreeNode> R2L = new LinkedList<>(); if(root == null){ return result; } L2R.push(root); result.add(new ArrayList<Integer>(Arrays.asList(root.val))); while(L2R.size() != 0 || R2L.size() != 0){ tmpRes.clear(); while(L2R.size() != 0){ TreeNode cur = L2R.pop(); if(cur.right != null){ R2L.push(cur.right); tmpRes.add(cur.right.val); } if(cur.left != null){ R2L.push(cur.left); tmpRes.add(cur.left.val); } } if(tmpRes.size() != 0){ result.add(new ArrayList<Integer>(tmpRes)); tmpRes.clear(); } while(R2L.size() != 0){ TreeNode cur = R2L.pop(); if(cur.left != null){ L2R.push(cur.left); tmpRes.add(cur.left.val); } if(cur.right != null){ L2R.push(cur.right); tmpRes.add(cur.right.val); } } if(tmpRes.size() != 0){ result.add(new ArrayList<Integer>(tmpRes)); tmpRes.clear(); } } return result; } }
转载请注明原文地址: https://www.6miu.com/read-24659.html

最新回复(0)