博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树的锯齿形层次遍历
阅读量:6424 次
发布时间:2019-06-23

本文共 1385 字,大约阅读时间需要 4 分钟。

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:

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

3   / \  9  20    /  \   15   7复制代码

返回锯齿形层次遍历如下:

[  [3],  [20,9],  [15,7]]复制代码
/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    public List
> zigzagLevelOrder(TreeNode root) { List
> res = new ArrayList
>(); if( root == null ) return res; Deque
tree = new LinkedList<>(); tree.add( root ); TreeNode end = root; Boolean flag = true; List
list = new ArrayList<>(); while( !tree.isEmpty() ){ TreeNode cur = flag ? tree.pollFirst() : tree.pollLast(); list.add( cur.val ); if( flag ){ if( cur.left != null ){ tree.offerLast( cur.left ); } if( cur.right != null ){ tree.offerLast( cur.right ); } }else{ if( cur.right != null ){ tree.offerFirst( cur.right ); } if( cur.left != null ){ tree.offerFirst( cur.left ); } } if( cur == end ){ res.add( list ); list = new ArrayList<>(); end = flag ? tree.peekFirst() : tree.peekLast(); flag = !flag; } } return res; }}复制代码

解题思路: 使用双向链表保存下一层的值 , 用end指向当前层遍历的最后一个结点,如果当前层的遍历顺序是从左到右 , 则每次弹出的都是链表的第一个元素 , 然后再把左右结点压入链表的尾部,先压左再压右;如果当前层的遍历顺序是从右到左,则每次弹出的都是最后一个结点 , 然后把右左压入到头部,先压右再压左。

转载于:https://juejin.im/post/5c905caef265da60cf50e833

你可能感兴趣的文章
RealServer配置脚本
查看>>
分布式文件系统MogileFS
查看>>
Java23种设计模式案例:策略模式(strategy)
查看>>
XML解析之DOM4J
查看>>
图解微服务架构演进
查看>>
SQL PATINDEX 详解
查看>>
CSP -- 运营商内容劫持(广告)的终结者
查看>>
DIV+CSS命名规范有助于SEO
查看>>
web项目buildPath与lib的区别
查看>>
我的友情链接
查看>>
ifconfig:command not found的解决方法
查看>>
计算机是怎么存储数字的
查看>>
Codeforces Round #369 (Div. 2) A. Bus to Udayland 水题
查看>>
adb上使用cp/mv命令的替代方法(failed on '***' - Cross-device link解决方法)
查看>>
C++标准库简介、与STL的关系。
查看>>
Spring Boot 3 Hibernate
查看>>
查询EBS请求日志的位置和名称
查看>>
大型机、小型机、x86服务器的区别
查看>>
J2EE十三个规范小结
查看>>
算法(第四版)C#题解——2.1
查看>>