剑指offer_把二叉树打印成多行+之字形
来源:互联网 发布:qsv转换flv软件 编辑:程序博客网 时间:2024/06/02 06:28
/*1. 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。按层次打印可以用队列,如何保证一层输出一行,进队列的时候,加标记,出队时候遇到标记则一行结束剑指offer思路:用两个变量表示当前层还未打印的节点数和下一层的节点数*/import java.util.ArrayList;import java.util.ArrayDeque;import java.util.Queue;import java.util.Stack;class Print{public static ArrayList<ArrayList<Integer>> print1(TreeNode pRoot) {ArrayList<ArrayList<Integer>> alAllLine=new ArrayList<ArrayList<Integer>>();if (pRoot==null){return alAllLine;}ArrayList<Integer> alOneLine=new ArrayList<Integer>();alOneLine.add(pRoot.val);alAllLine.add(alOneLine);Queue<TreeNode> queue=new ArrayDeque<TreeNode>();queue.add(pRoot.left);queue.add(pRoot.right);queue.add(pRoot);//pRoot作为标记ArrayList<Integer> alOneLineNext=new ArrayList<Integer>();while (!queue.isEmpty()){TreeNode front=queue.remove();if (front==pRoot){alAllLine.add(alOneLineNext);if(queue.size()>0){alOneLineNext=new ArrayList<Integer>();queue.add(pRoot);}continue;}alOneLineNext.add(front.val);if (front.left!=null){queue.add(front.left);}if (front.right!=null){queue.add(front.right);}}return alAllLine; }public static ArrayList<ArrayList<Integer>> print2(TreeNode pRoot){ArrayList<ArrayList<Integer>> alAllLine=new ArrayList<ArrayList<Integer>>();if (pRoot==null){return alAllLine;}int toBePrinted=1;int nextLine=0;Queue<TreeNode> queue=new ArrayDeque<TreeNode>();queue.add(pRoot);ArrayList<Integer> alOneLine=new ArrayList<Integer>();while (!queue.isEmpty()){TreeNode front=queue.remove();alOneLine.add(front.val);toBePrinted--;if (front.left!=null){queue.add(front.left);nextLine++;}if (front.right!=null){queue.add(front.right);nextLine++;}if (toBePrinted==0){alAllLine.add(alOneLine);alOneLine=new ArrayList<Integer>();toBePrinted=nextLine;nextLine=0;}}return alAllLine;}/*2. 请实现一个函数按照之字形打印二叉树, 即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 如何做到之字,需要栈吗?*/public static ArrayList<ArrayList<Integer>> printZ(TreeNode pRoot){ArrayList<ArrayList<Integer>> alAllLine=new ArrayList<ArrayList<Integer>>();if (pRoot==null){return alAllLine;}int toBePrinted=1;int nextLine=0;int direct=0;Queue<TreeNode> queue=new ArrayDeque<TreeNode>();queue.add(pRoot);ArrayList<Integer> alOneLine=new ArrayList<Integer>();while (!queue.isEmpty()){TreeNode front=queue.remove();alOneLine.add(front.val);toBePrinted--;if (front.left!=null){queue.add(front.left);nextLine++;}if (front.right!=null){queue.add(front.right);nextLine++;}if (toBePrinted==0){if (direct==0){alAllLine.add(alOneLine);}else//每隔一层进行反转{ArrayList<Integer> alOneLineReverse=new ArrayList<Integer>();for (int i=alOneLine.size()-1; i>=0; i--){alOneLineReverse.add(alOneLine.get(i));}alAllLine.add(alOneLineReverse);}direct=1-direct;alOneLine=new ArrayList<Integer>();toBePrinted=nextLine;nextLine=0;}}return alAllLine;}/*上述方法还是用队列按层次遍历,不过是隔一层利用辅助ArrayList反转一下元素顺序考虑用栈,直接在遍历过程中确定好元素顺序要用两个栈,一个栈用来入,一个用来出,如果只用一个,栈后进先出,元素顺序会打乱*/public static ArrayList<ArrayList<Integer>> printZ2(TreeNode pRoot){ArrayList<ArrayList<Integer>> alAllLine=new ArrayList<ArrayList<Integer>>();if (pRoot==null){return alAllLine;}Stack<TreeNode> s1=new Stack<TreeNode>();Stack<TreeNode> s2=new Stack<TreeNode>();s1.push(pRoot);while (!s1.empty()||!s2.empty()){ArrayList<Integer> alOneLine=new ArrayList<Integer>();while (!s1.empty()){TreeNode top=s1.pop();alOneLine.add(top.val);if (top.left!=null){s2.push(top.left);}if (top.right!=null){s2.push(top.right);}}if (alOneLine.size()>0){alAllLine.add(alOneLine);}alOneLine=new ArrayList<Integer>();while (!s2.empty()){TreeNode top=s2.pop();alOneLine.add(top.val);if (top.right!=null){s1.push(top.right);}if (top.left!=null){s1.push(top.left);}}if (alOneLine.size()>0){alAllLine.add(alOneLine);}}return alAllLine;}public static void main(String[] args) {TreeNode node1=new TreeNode(1);TreeNode node2=new TreeNode(2);TreeNode node3=new TreeNode(3);TreeNode node4=new TreeNode(4);TreeNode node5=new TreeNode(5);TreeNode node6=new TreeNode(6);TreeNode node7=new TreeNode(7);node1.left=node2;node1.right=node3;node2.left=node4;node2.right=node5;node3.left=node6;node3.right=node7;ArrayList<ArrayList<Integer>> alAllLine=printZ2(node1);for (ArrayList<Integer> alOneLine: alAllLine){for (int i: alOneLine){System.out.print(i);}System.out.println();}}}
阅读全文
0 0
- 剑指offer_把二叉树打印成多行+之字形
- 剑指offer_二叉树---之字形打印二叉树
- 剑指offer_二叉树---把二叉树打印成多行
- 按之字形顺序打印二叉树, 把二叉树打印成多行
- 之字形打印二叉树
- 之字形打印二叉树
- 之字形打印二叉树
- 之字形打印二叉树
- 剑指offer----之字形打印二叉树
- 剑指offer55--之字形式打印二叉树
- 把二叉树打印成多行 按之字形顺序打印二叉树 binary tree zigzag level order traversal
- 按之字形打印二叉树
- 按照之字形打印二叉树
- 按之字形打印二叉树
- 按之字形打印二叉树
- 剑指offer_二叉树---从上往下打印二叉树
- 二叉树------之字形打印二叉树
- 剑指offer--按之字形顺序打印二叉树
- ImportError: cannot import name IncompleteRead
- ssh-keygen的使用方法
- Circum Triangle UVA
- Linux下安装nginx
- 测试一下
- 剑指offer_把二叉树打印成多行+之字形
- sql常用的拆分和拼接函数
- 二分图
- redis 数据结构
- tf.get_variable 和tf.variable_scope
- win7 eclipse 调试spark
- 第四章 -- 多态的概念
- java调度任务之Timer
- 在Ubuntu 12.04上利用IP Tables来设置防火墙