59按之字形顺序打印二叉树

题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

需要2个桟(后进先出)。

我们在打印某一行节点时,把下一层的子节点保存到相应的桟里。如果当前打印的是奇数层,则先保存左子树再保存右子树节点到

第一个桟里,如果当前打印的是偶数层,则先保存右子树再保存左子树节点。

 1 import java.util.ArrayList;
 2 import java.util.Stack;
 3 /*
 4 public class TreeNode {
 5     int val = 0;
 6     TreeNode left = null;
 7     TreeNode right = null;
 8
 9     public TreeNode(int val) {
10         this.val = val;
11
12     }
13
14 }
15 */
16 public class Solution {
17     public ArrayList<ArrayList<Integer> > Print(TreeNode root) {
18         ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
19         Stack<TreeNode> stack1 = new Stack<TreeNode>();
20         Stack<TreeNode> stack2 = new Stack<TreeNode>();
21         int flag = 1;
22         stack1.push(root);
23         while(!stack1.empty()||!stack2.empty()){
24             if(flag==1){
25                 ArrayList<Integer> res_temp = new ArrayList<Integer>();
26                 while(!stack1.empty()){
27                     TreeNode resNode = stack1.pop();
28                     if(resNode !=null){
29                         res_temp.add(resNode.val);
30                         stack2.push(resNode.left);
31                         stack2.push(resNode.right);
32                     }
33                 }
34                 if(!res_temp.isEmpty())
35                     res.add(res_temp);
36                 flag = 1-flag;
37             }
38             else{
39                 ArrayList<Integer> res_temp = new ArrayList<Integer>();
40                 while(!stack2.empty()){
41                     TreeNode resNode = stack2.pop();
42                     if(resNode!=null){
43                         res_temp.add(resNode.val);
44                         stack1.push(resNode.right);
45                         stack1.push(resNode.left);
46                     }
47                 }
48                    if(!res_temp.isEmpty())
49                     res.add(res_temp);
50                  flag = 1-flag;
51             }
52         }
53         return res;
54     }
55
56 }

原文地址:https://www.cnblogs.com/zle1992/p/8277596.html

时间: 2024-10-10 04:20:59

59按之字形顺序打印二叉树的相关文章

按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vect

按之字形顺序打印二叉树-剑指Offer

按之字形顺序打印二叉树 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路 根据题意,每行的节点的访问顺序是相反的,我们可以用两个栈来隔行存储,一个栈中根据“左结点->右结点”的顺序访问另一个栈的栈顶元素,而另一个栈根据“右子树->左子树”的顺序访问另一个栈的栈顶元素,直到两个栈都为空 代码 import java.util.ArrayList; import java.util.St

《剑指offer》:[61]按之字形顺序打印二叉树

题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三层再按照从左到右打印,其他行以此类推. 例如:按之字形顺序打印二叉树的结果如下图: 打印结果: 1 3,2 4,5,6,7 15,14,13,12,11,10,9,8 方案:利用两个栈.时间复杂度O(N)+辅助空间2*O(N). 具体方法:我们在打印某一结点时,把下一层的子结点保存到相应的栈里.如果当前打印的是奇数层(例如第一层,第三层...第2*n+1层),则先保存左子结点再保存右子

按之字形顺序打印二叉树(剑指offer+队栈的应用)

按之字形顺序打印二叉树 参与人数:703时间限制:1秒空间限制:32768K 通过比例:25.31% 最佳记录:0 ms|8552K(  ) 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题意:看测试用例 测试用例: {8,6,10,5,7,9,11} 对应输出应该为: [[8],[10,6],[5,7,9,11]] 思路:用一个布尔量控制从左到右还是从右到左的顺序:先放入栈中,然后把他

59、剑指offer--按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路:通过分析,使用栈进行存储结点 打印1时,将结点2 3 放入栈中,打印3时,将3的左右孩子67分别放入栈中想放入7 再放6. 通过举例分析,对于父结点在偶数行,先放入右子结点.再放入左子结点(栈2),对于父结点在奇数行,先放入左子结点再放入右子结点(栈1).因此使用两个栈进行存储. 使用两个栈的原因,例如2 3 都在栈中,弹出3,需要

剑指offer 59.树 按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路 用一个栈s1来存放奇数层节点,另一个栈s2来存放偶数层节点 代码如下 public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { int layer = 1; //s1存奇数层节点 Stack<TreeNode> s1 = new Stack&

剑指offer(五十三)之按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 代码: <span style="color:#000099;">import java.util.ArrayList; import java.util.*; /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = n

剑指Offer-- 之字形顺序打印二叉树

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vector<i

剑指Offer——按之字形顺序打印二叉树

题目描述: 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 分析: 我们都知道二叉树的层次遍历用的是队列. 但是这个的子树的结点是先进后出的,所以我们使用栈更加方便. 而且为了方便,我用了两个栈,因为不是每一次都是先进左子树再进右子树的. 代码: 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNod