S2 icon indicating copy to clipboard operation
S2 copied to clipboard

0103. Binary Tree Zigzag Level Order Traversal | LeetCode Cookbook

Open halfrost opened this issue 4 years ago • 10 comments

https://books.halfrost.com/leetcode/ChapterFour/0100~0199/0103.Binary-Tree-Zigzag-Level-Order-Traversal/

halfrost avatar Aug 23 '20 11:08 halfrost

func zigzagLevelOrder(root *TreeNode) [][]int {
	var res [][]int
	search(root, 0, &res)
	return res
}

func search(root *TreeNode, depth int, res *[][]int) {
	if root == nil {
		return
	}
	for len(*res) < depth+1 {
		*res = append(*res, []int{})
	}
	if depth%2==0 {
		(*res)[depth] = append((*res)[depth], root.Val)
	}else{
		(*res)[depth] = append([]int{root.Val}, (*res)[depth]...)
	}
	search(root.Left, depth+1, res)
	search(root.Right, depth+1, res)
}

techkang avatar Sep 15 '20 11:09 techkang

@techkang

func zigzagLevelOrder(root *TreeNode) [][]int {
	var res [][]int
	search(root, 0, &res)
	return res
}

func search(root *TreeNode, depth int, res *[][]int) {
	if root == nil {
		return
	}
	for len(*res) < depth+1 {
		*res = append(*res, []int{})
	}
	if depth%2==0 {
		(*res)[depth] = append((*res)[depth], root.Val)
	}else{
		(*res)[depth] = append([]int{root.Val}, (*res)[depth]...)
	}
	search(root.Left, depth+1, res)
	search(root.Right, depth+1, res)
}

@techkang 我之前也用你这个解法提交过,当时内存比现在这个解法略高一些,我就写了现在这个了。不过现在看来,递归的解法也挺简洁的。我也放进题解吧。谢谢你~❤️

halfrost avatar Sep 15 '20 12:09 halfrost

说个简单点的想法 迭代的方式 用队列写层序遍历, 设置个flag 每次层序遍历若flag==true 该层不逆序 ,把flag改为false 若flag==false,该层逆序,flag改为true JAVA代码

    class Solution {
        public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
            if (root == null) return new ArrayList<>();
            Queue<TreeNode> queue = new LinkedList();
            List<List<Integer>> ans = new ArrayList<>();
            queue.add(root);
            boolean flag = true;
            while (!queue.isEmpty()) {
                int len = queue.size();
                List<Integer> list = new ArrayList<>();
                for (int i = 0; i < len; i++) {
                    TreeNode cur = queue.poll();
                    list.add(cur.val);
                    if (cur.left != null)
                        queue.add(cur.left);
                    if (cur.right != null)
                        queue.add(cur.right);
                }
                if (flag) {
                    flag = false;
                } else {
                    Collections.reverse(list);
                    flag = true;
                }
                ans.add(list);
            }
            return ans;
        }
    }
}

OpensourceHU avatar Sep 22 '20 07:09 OpensourceHU

说个简单点的想法 迭代的方式 用队列写层序遍历, 设置个flag 每次层序遍历若flag==true 该层不逆序 ,把flag改为false 若flag==false,该层逆序,flag改为true JAVA代码

    class Solution {
        public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
            if (root == null) return new ArrayList<>();
            Queue<TreeNode> queue = new LinkedList();
            List<List<Integer>> ans = new ArrayList<>();
            queue.add(root);
            boolean flag = true;
            while (!queue.isEmpty()) {
                int len = queue.size();
                List<Integer> list = new ArrayList<>();
                for (int i = 0; i < len; i++) {
                    TreeNode cur = queue.poll();
                    list.add(cur.val);
                    if (cur.left != null)
                        queue.add(cur.left);
                    if (cur.right != null)
                        queue.add(cur.right);
                }
                if (flag) {
                    flag = false;
                } else {
                    Collections.reverse(list);
                    flag = true;
                }
                ans.add(list);
            }
            return ans;
        }
    }
}

@OpensourceHU 你这个解法挺简洁的,思路很清晰👍🏻

halfrost avatar Sep 22 '20 16:09 halfrost

func zigzagLevelOrder(root *TreeNode) [][]int {
    res := [][]int{}
    if root == nil{
	    return res
    }
    q := []*TreeNode{root}
    var size, i, j int
    var lay []int
    var tmp []*TreeNode
    var flag bool
    flag = false
    for len(q) > 0{
	    size = len(q)
	    tmp = []*TreeNode{}
	    lay = make([]int, size)
	    j = size-1
	    for i=0; i<size; i++{
		    root = q[0]
		    q = q[1:]
		    if !flag{
			    lay[i] = root.Val
		    }else{
			    lay[j] = root.Val
			    j--
		    }
		    if root.Left != nil{
			    tmp = append(tmp, root.Left)
		    }
		    if root.Right != nil{
			    tmp = append(tmp, root.Right)
		    }

	    }
	    res = append(res, lay)
	    flag = !flag
	    q = tmp
    }

    return res
}

crissu avatar Mar 10 '21 14:03 crissu

@crissu func zigzagLevelOrder(root *TreeNode) [][]int { res := [][]int{} if root == nil{ return res } q := []*TreeNode{root} var size, i, j int var lay []int var tmp []*TreeNode var flag bool flag = false for len(q) > 0{ size = len(q) tmp = []*TreeNode{} lay = make([]int, size) j = size-1 for i=0; i<size; i++{ root = q[0] q = q[1:] if !flag{ lay[i] = root.Val }else{ lay[j] = root.Val j-- } if root.Left != nil{ tmp = append(tmp, root.Left) } if root.Right != nil{ tmp = append(tmp, root.Right) }

      }
      res = append(res, lay)
      flag = !flag
      q = tmp
  }

  return res
}

BFS 的解法也很好。想提交一个 PR 把你的解法也合并进题解不?😉

halfrost avatar Mar 11 '21 14:03 halfrost

@crissu func zigzagLevelOrder(root *TreeNode) [][]int { res := [][]int{} if root == nil{ return res } q := []*TreeNode{root} var size, i, j int var lay []int var tmp []*TreeNode var flag bool flag = false for len(q) > 0{ size = len(q) tmp = []*TreeNode{} lay = make([]int, size) j = size-1 for i=0; i<size; i++{ root = q[0] q = q[1:] if !flag{ lay[i] = root.Val }else{ lay[j] = root.Val j-- } if root.Left != nil{ tmp = append(tmp, root.Left) } if root.Right != nil{ tmp = append(tmp, root.Right) }

      }
      res = append(res, lay)
      flag = !flag
      q = tmp
  }

  return res
}

BFS 的解法也很好。想提交一个 PR 把你的解法也合并进题解不?😉

可以的

crissu avatar Mar 16 '21 05:03 crissu

@crissu 已把你的 BFS 解法添加至题解中。

halfrost avatar Mar 16 '21 06:03 halfrost

可以BFS直接套用102题的代码,改一下每层加入返回值数组的节点顺序即可,用了滚动数组时间也是beat 100%的:

func zigzagLevelOrder(root *TreeNode) (res [][]int) {
    if root == nil {
        return
    }
    levels := [2][]*TreeNode{}
    levels[0] = []*TreeNode{root}
    for len(levels[len(res)%2]) != 0 {
        curr := len(res) % 2
        next := (curr + 1) % 2
        levels[next] = nil
        res = append(res, nil)
        for i, node := range levels[curr] {
            if curr % 2 == 0 {
                res[len(res)-1] = append(res[len(res)-1], node.Val)
            } else {
                res[len(res)-1] = append(res[len(res)-1], levels[curr][len(levels[curr])-1-i].Val)
            }
            
            if node.Left != nil {
                levels[next] = append(levels[next], node.Left)
            }
            if node.Right != nil {
                levels[next] = append(levels[next], node.Right)
            }
        }
    }
    return
}

hanlins avatar Jun 16 '21 20:06 hanlins

套用层序遍历 func zigzagLevelOrder(root *TreeNode) [][]int { queue := []*TreeNode{root} res := [][]int{} if root == nil { return res } flag := true //true 表示从左向右遍历 for len(queue) != 0 { n := len(queue) temp := make([]int,n) for i :=0;i<n;i++{ if queue[i].Left != nil { queue = append(queue,queue[i].Left) } if queue[i].Right != nil { queue = append(queue,queue[i].Right) } if flag { temp[i] = queue[i].Val }else { temp[i] = queue[n-i-1].Val } }

    queue = queue[n:]
    flag =!flag
    res = append(res,temp)

    
}

return res }

owenhung avatar Mar 10 '22 01:03 owenhung