按之字形顺序打印二叉树
来源:互联网 发布:酒水包装设计软件 编辑:程序博客网 时间:2024/06/07 17:14
题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}
思路一:
s1存奇数层节点
s2存偶数层节点
用两个栈交替压入并弹出
import java.util.ArrayList;import java.util.Stack;public class Solution { public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { int layer = 1; Stack<TreeNode> s1 = new Stack<>(); Stack<TreeNode> s2 = new Stack<>(); s1.add(pRoot); ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>(); while (!s1.isEmpty() || !s2.isEmpty()) { if (layer % 2 == 1) { ArrayList<Integer> tmp = new ArrayList<>(); while (!s1.isEmpty()) { TreeNode node = s1.pop(); if (node != null) { tmp.add(node.val); s2.add(node.left); s2.add(node.right); } } if (!tmp.isEmpty()) { list.add(tmp); layer++; } } else { ArrayList<Integer> tmp2 = new ArrayList<>(); while (!s2.isEmpty()) { TreeNode node2 = s2.pop(); if (node2 != null) { tmp2.add(node2.val); s1.add(node2.right); s1.add(node2.left); } } if (!tmp2.isEmpty()) { list.add(tmp2); layer++; } } } return list; }}
思路二:
利用Java中的LinkedList的底层实现是双向链表的特点。
1)可用做队列,实现树的层次遍历
2)可双向遍历,奇数层时从前向后遍历,偶数层时从后向前遍历
import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedList;public class Solution { public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); if (pRoot == null) return res; boolean leftToRight = true; LinkedList<TreeNode> queue = new LinkedList<>(); ArrayList<Integer> list = new ArrayList<>(); queue.add(null); //添加分层符 queue.add(pRoot); while (queue.size() > 1) { TreeNode node = queue.poll(); if (node == null) { Iterator<TreeNode> iter = null; if (leftToRight) iter = queue.iterator(); else iter = queue.descendingIterator(); leftToRight = !leftToRight; while (iter.hasNext()) list.add(iter.next().val); res.add(new ArrayList<>(list)); queue.add(null); list.clear(); continue; } if (node.left != null) queue.add(node.left); if (node.right != null) queue.add(node.right); } return res; }}
思路三:
按层序遍历分层打印的代码,添加一段判断用以倒序输出即可
import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;public class Solution { public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); if (pRoot == null) return res; boolean leftToRight = true; Queue<TreeNode> queue = new LinkedList<>(); ArrayList<Integer> list = new ArrayList<>(); queue.add(pRoot); int start = 0; int end = 1; while (!queue.isEmpty()) { TreeNode node = queue.poll(); list.add(node.val); start++; if (node.left != null) queue.add(node.left); if (node.right != null) queue.add(node.right); if (start == end) { start = 0; end = queue.size(); if (leftToRight) res.add(list); else res.add(Reverse(list)); leftToRight = !leftToRight; list = new ArrayList<>(); } } return res; } private ArrayList<Integer> Reverse(ArrayList<Integer> list) { ArrayList<Integer> newList = new ArrayList<>(); for (int i = list.size() - 1; i >= 0; i--) newList.add(list.get(i)); return newList; }}
阅读全文
0 0
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 牛客网 | 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 55.按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 【59】按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- Q61:按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- jvm调优2
- 菜鸟编程 关于函数的一点总结
- freemarker加载模板文件的
- python: 多属性排序
- HDOJ 1024 DP
- 按之字形顺序打印二叉树
- 三种编程命名规则(匈牙利法,小驼峰法,大驼峰法)
- 第十二章:通过异常来处理错误
- stl源码剖析一些记录
- 任务分发系统-Qcmd-http详解
- firewall-cmd防火墙
- 你是否了解新媒体,新媒体简介
- javascript简单的加减乘除运算
- java web session过期 跳转页面没有跳出frame的问题