常考数据结构与算法:二叉树的之字形层序遍历
题目描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
例如:
给定的二叉树是{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);
// }
// }}
常考数据结构与算法:二叉树的之字形层序遍历相关推荐
- 常考数据结构与算法:二叉树的最大深度
题目描述 求给定二叉树的最大深度, 最大深度是指树的根结点到最远叶子结点的最长路径上结点的数量. class TreeNode {int val;TreeNode left;TreeNode righ ...
- 常考数据结构与算法:二叉树的镜像
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \. 6 10 / \ / \. 5 7 9 11 镜像二叉树 8 / \. 10 6 / \ ...
- 常考数据结构与算法:输出二叉树的右视图
题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...
- 常考数据结构与算法:求二叉树的层序遍历
题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...
- 二叉树的之字形层序遍历
二叉树的之字形层序遍历 1.参考资料 https://www.nowcoder.com/practice/47e1687126fa461e8a3aff8632aa5559 2.题目要求 题目描述 给定 ...
- 牛客题霸 [二叉树的之字形层序遍历] C++题解/答案
牛客题霸 [二叉树的之字形层序遍历] C++题解/答案 题目描述 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 例如: 给定的二叉树是{3,9,20, ...
- 常考数据结构与算法:在二叉树中找到两个节点的最近公共祖先
题目描述 给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点. 假设节点的值都大于0. 比如9,10的最近公共祖先节点是2. 思路: 从根节点开始遍历 ...
- 常考数据结构与算法:实现二叉树先序,中序和后序遍历
题目描述 分别按照二叉树先序,中序和后序打印所有的节点. 输入 {1,2,3} 返回值 [[1,2,3],[2,1,3],[2,3,1]] import java.util.ArrayList;cla ...
- 常考数据结构与算法----给定一个二叉树和一个值 sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径,
题目描述 给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径, 例如: 给出如下的二叉树,sum=22, 返回 [ [5,4,11,2], [5,8,9] ] 示 ...
最新文章
- 使用docker commit将修改后的容器保存为镜像及其使用注意事项
- boost::hana::intersperse用法的测试程序
- Thread类的有关方法以及优先级
- cups共享linux打印机_linux入门-映射网络驱动器
- scala 获取数组中元素_从Scala中的元素列表中获取随机元素
- Facebook广告投放有什么策略?
- 经常吃番茄对身体有什么影响?
- [CF808B] Average Sleep Time([强行]树状数组,数学)
- 看懂别人的代码,和自己能写代码是两回事
- 通过释放cache内存解决ubuntu死机问题
- jsp 文件使用 include指令 导入 jspf 分析,及导入jspf 文件后出现乱码问题
- JavaScript标识符与关键字和保留字
- linux服务器操作系统
- 易于查阅,幕布记忆思维导图
- 《通信电子电路》第一章——小信号调谐放大器
- android 图片跑马灯动画,Android实现图文垂直跑马灯效果
- 深度解析网易严选和京东的会员体系,建议收藏
- 《中国航海》投稿经验
- 在jsp中使用ECharts制作图表
- 什么决定了局域网特性