题目描述

给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
例如:
给定的二叉树是{3,9,20,#,#,15,7},

该二叉树之字形层序遍历的结果是

[

[3],

[20,9],

[15,7]

]

示例1

输入

{1,#,2}

返回值

[[1],[2]]

二叉树遍历,脑海中立刻想到的就是深度优先遍历和广度优先遍历,这两种方式相信大家都驾轻就熟了,就不再过多累赘。

import java.util.ArrayList;
import java.util.Stack;public class ZigzagLevelOrderMe {public static void main(String[]args){//System.out.println("Hello Wolrd!");TreeNode root=new TreeNode(3);root.left=new TreeNode(9);root.right=new TreeNode(20);root.right.left=new TreeNode(15);root.right.right=new TreeNode(7);ZigzagLevelOrderMe s=new ZigzagLevelOrderMe();System.out.println(s.zigzagLevelOrder(root));//s.loop(root);}/* 思路一用栈实现设两个栈,s2存放奇数层,s1存放偶数层遍历s2节点的同时按照左子树、右子树的顺序加入s1,遍历s1节点的同时按照右子树、左子树的顺序加入s2*/public ArrayList<ArrayList<Integer>> zigzagLevelOrder (TreeNode root) {ArrayList<ArrayList<Integer>> arr=new ArrayList<ArrayList<Integer>>();if(root==null)return arr;Stack<TreeNode> stack1 = new Stack();Stack<TreeNode> stack2 = new Stack();boolean isLeftToRight = true;stack1.push(root);while(!stack1.isEmpty() || !stack2.isEmpty()){ArrayList<Integer> temp = new ArrayList<>();if(isLeftToRight){while(!stack1.isEmpty()){TreeNode node = stack1.pop();temp.add(node.val);if(node.left != null){stack2.push(node.left);}if(node.right != null){stack2.push(node.right);}}}else{while(!stack2.isEmpty()){TreeNode node = stack2.pop();temp.add(node.val);if(node.right != null){stack1.push(node.right);}if(node.left != null){stack1.push(node.left);}}}if(!temp.isEmpty()){arr.add(temp);}isLeftToRight = !isLeftToRight;}return arr;}// 思路二// 第一层从左向右,下一层从右向左,一直这样交替//递归版实现二叉树的层次遍历(之字形遍历)public  void zigzagLevelHelper2(TreeNode root,int level, ArrayList<ArrayList<Integer>> arr){if(root==null)return ;if(level==arr.size()){ArrayList<Integer>newlevelResult=new ArrayList<>();if(level%2==0)                   //偶数层newlevelResult.add(root.val);else                             //奇数层newlevelResult.add(0,root.val);arr.add(newlevelResult);}else{ArrayList<Integer>levelResult=arr.get(level);if(level%2==0)levelResult.add(root.val);elselevelResult.add(0,root.val);arr.set(level,levelResult);}//递归遍历左右节点zigzagLevelHelper2(root.left,level+1,arr);zigzagLevelHelper2(root.right,level+1,arr);}/*用栈实现设两个栈,s2存放奇数层,s1存放偶数层遍历s2节点的同时按照左子树、右子树的顺序加入s1,遍历s1节点的同时按照右子树、左子树的顺序加入s2*/
//    public void loop(TreeNode root) {
//        if (root == null) return;
//
//        ArrayList<TreeNode> res = new ArrayList<>();
//
//        Stack<TreeNode> stack1 = new Stack<>();
//        Stack<TreeNode> stack2 = new Stack<>();
//        boolean left2Right = true;
//
//        stack1.push(root);
//
//        while (!stack1.isEmpty() || !stack2.isEmpty()) {
//            // 从左向右
//            if (left2Right) {
//
//                while (!stack1.isEmpty()) {
//                    TreeNode node = stack1.pop();
//                    res.add(node);
//                    if (node.left != null) {
//                        stack2.push(node.left);
//                    }
//                    if (node.right != null) {
//                        stack2.push(node.right);
//                    }
//                }
//                // 从右向左
//            } else {
//                while (!stack2.isEmpty()) {
//                    TreeNode node = stack2.pop();
//                    res.add(node);
//                    if (node.right != null) {
//                        stack1.push(node.right);
//                    }
//                    if (node.left != null) {
//                        stack1.push(node.left);
//                    }
//                }
//            }
//
//            left2Right = !left2Right;
//        }
//
//        for (TreeNode node : res) {
//            System.out.println("" + node.val);
//        }
//    }}

常考数据结构与算法:二叉树的之字形层序遍历相关推荐

  1. 常考数据结构与算法:二叉树的最大深度

    题目描述 求给定二叉树的最大深度, 最大深度是指树的根结点到最远叶子结点的最长路径上结点的数量. class TreeNode {int val;TreeNode left;TreeNode righ ...

  2. 常考数据结构与算法:二叉树的镜像

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \. 6 10 / \ / \. 5 7 9 11 镜像二叉树 8 / \. 10 6 / \ ...

  3. 常考数据结构与算法:输出二叉树的右视图

    题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...

  4. 常考数据结构与算法:求二叉树的层序遍历

    题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...

  5. 二叉树的之字形层序遍历

    二叉树的之字形层序遍历 1.参考资料 https://www.nowcoder.com/practice/47e1687126fa461e8a3aff8632aa5559 2.题目要求 题目描述 给定 ...

  6. 牛客题霸 [二叉树的之字形层序遍历] C++题解/答案

    牛客题霸 [二叉树的之字形层序遍历] C++题解/答案 题目描述 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 例如: 给定的二叉树是{3,9,20, ...

  7. 常考数据结构与算法:在二叉树中找到两个节点的最近公共祖先

    题目描述 给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点.   假设节点的值都大于0. 比如9,10的最近公共祖先节点是2. 思路: 从根节点开始遍历 ...

  8. 常考数据结构与算法:实现二叉树先序,中序和后序遍历

    题目描述 分别按照二叉树先序,中序和后序打印所有的节点. 输入 {1,2,3} 返回值 [[1,2,3],[2,1,3],[2,3,1]] import java.util.ArrayList;cla ...

  9. 常考数据结构与算法----给定一个二叉树和一个值 sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径,

    题目描述 给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径, 例如: 给出如下的二叉树,sum=22, 返回 [ [5,4,11,2], [5,8,9] ] 示 ...

最新文章

  1. 使用docker commit将修改后的容器保存为镜像及其使用注意事项
  2. boost::hana::intersperse用法的测试程序
  3. Thread类的有关方法以及优先级
  4. cups共享linux打印机_linux入门-映射网络驱动器
  5. scala 获取数组中元素_从Scala中的元素列表中获取随机元素
  6. Facebook广告投放有什么策略?
  7. 经常吃番茄对身体有什么影响?
  8. [CF808B] Average Sleep Time([强行]树状数组,数学)
  9. 看懂别人的代码,和自己能写代码是两回事
  10. 通过释放cache内存解决ubuntu死机问题
  11. jsp 文件使用 include指令 导入 jspf 分析,及导入jspf 文件后出现乱码问题
  12. JavaScript标识符与关键字和保留字
  13. linux服务器操作系统
  14. 易于查阅,幕布记忆思维导图
  15. 《通信电子电路》第一章——小信号调谐放大器
  16. android 图片跑马灯动画,Android实现图文垂直跑马灯效果
  17. 深度解析网易严选和京东的会员体系,建议收藏
  18. 《中国航海》投稿经验
  19. 在jsp中使用ECharts制作图表
  20. 什么决定了局域网特性

热门文章

  1. 数字变化滚动到指定数字的文字特效
  2. 四种Sandcastle方法生成c#.net帮助类帮助文档
  3. android 通过GPS获取用户地理位置并监听位置变化
  4. 性能优化技巧 - 组表数据更新
  5. Leet Code OJ 简单(二)
  6. scalikejdbc 学习笔记(4)
  7. 条码扫描枪----针对MS3391扫码器的工作原理
  8. struts2配置的ajax参数传递方法
  9. Linux 性能监测工具
  10. Oracle EBS常用数据表