LeetCode:103. Binary Tree Zigzag Level Order Traversal

栏目: 数据库 · 发布时间: 6年前

内容简介:本文为LeetCode:一颗给定的二叉树,返回节点值的之子形的便利结果。即,从左到右,然后下一级别是从右到左,如此交替。例如:

本文为LeetCode: 103. Binary Tree Zigzag Level Order Traversal 的题解。

题意

一颗给定的二叉树,返回节点值的之子形的便利结果。即,从左到右,然后下一级别是从右到左,如此交替。

例如:

给定二叉树: [3,9,20,null,null,15,7]

3
   / \
  9  20
    /  \
   15   7

程序将会返回之字形遍历顺序:

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

题解

对于第一层遍历,从左到右,添加到一个stack中;对于第二层遍历,pop出来的顺序是从右到左,所以要额外考虑先添加right子节点、再添加left子节点到stack中。

代码

import java.util.*;

/**
 * https://www.robberphex.com/binary-tree-zigzag-level-order-traversal/
 */
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> levelTraversal = new ArrayList<>();
        if (root == null) {
            return levelTraversal;
        }

        // 第level级的节点存储在curLevel中
        int level = 0;
        Stack<TreeNode> curLevel = new Stack<>();
        curLevel.push(root);

        // 存储下一级节点
        Stack<TreeNode> nextLevel = new Stack<>();

        while (!curLevel.isEmpty()) {
            // 遍历当前层的节点
            List<Integer> traversal = new ArrayList<>();
            while (!curLevel.isEmpty()) {
                TreeNode cur;
                // 对于顺向层,pop是从左到右
                // 对于逆向层,pop是从右到左
                cur = curLevel.pop();
                if (cur == null) {
                    continue;
                }
                if (level % 2 == 1) {
                    nextLevel.push(cur.right);
                    nextLevel.push(cur.left);
                } else {
                    nextLevel.push(cur.left);
                    nextLevel.push(cur.right);
                }
                traversal.add(cur.val);
            }
            if (!traversal.isEmpty()) {
                levelTraversal.add(traversal);
            }
            level++;
            curLevel = nextLevel;
            nextLevel = new Stack<>();
        }

        return levelTraversal;
    }

    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.right.right = new TreeNode(5);
        List<List<Integer>> res = new Solution().zigzagLevelOrder(root);
        System.out.println(res);
        // 输出 [[1], [3, 2], [4, 5]]
    }
}

以上所述就是小编给大家介绍的《LeetCode:103. Binary Tree Zigzag Level Order Traversal》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

统计自然语言处理

统计自然语言处理

宗成庆 / 清华大学出版社 / 2008-5 / 66.00元

内容简介 本书全面介绍了统计自然语言处理的基本概念、理论方法和最新研究进展,内容包括形式语言与自动机及其在自然语言处理中的应用、语言模型、隐马尔可夫模型、语料库技术、汉语自动分词与词性标注、句法分析、词义消歧、统计机器翻译、语音翻译、文本分类、信息检索与问答系统、自动文摘和信息抽取、口语信息处理与人机对话系统等,既有对基础知识和理论模型的介绍,也有对相关问题的研究背景、实现方法和技术现状的详......一起来看看 《统计自然语言处理》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换