首页 > 试题广场 >

按之字形顺序打印二叉树

[编程题]按之字形顺序打印二叉树
  • 热度指数:537982 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)

数据范围:,树上每个节点的val满足
要求:空间复杂度:,时间复杂度:
例如:
给定的二叉树是{1,2,3,#,#,4,5}

该二叉树之字形层序遍历的结果是
[
[1],
[3,2],
[4,5]
]
示例1

输入

{1,2,3,#,#,4,5}

输出

[[1],[3,2],[4,5]]

说明

如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。     
示例2

输入

{8,6,10,5,7,9,11}

输出

[[8],[10,6],[5,7,9,11]]
示例3

输入

{1,2,3,4,5}

输出

[[1],[3,2],[4,5]]

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pRoot TreeNode类 
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> Print (TreeNode pRoot) {
        if(pRoot==null){
            return new ArrayList<>();
        }
        // write code here
        ArrayList<ArrayList<Integer>> list=new ArrayList<>();
        ArrayList<TreeNode> q=new ArrayList<>();
        int level=1; // 层数
        q.add(pRoot);
        while(q!=null && q.size()>0){
            ArrayList<Integer> subList=new ArrayList<>();
            // 判断是否偶数节点
            if(level%2==0){
                // 如果本层是偶数层,需要将本层倒置后记录本层节点
                Collections.reverse(q);
            }
            // 记录本层节点
            int len=q.size();
            for(int i=0;i<len;i++){
                TreeNode temp=q.get(i);
                subList.add(temp.val);
            }
            list.add(subList); 

            // 录入下一层节点
            if(level%2==0){
                // 如果本层是偶数层,需要将本层恢复正序后录入下一层
                Collections.reverse(q);
            }
            for(int i=0;i<len;i++){
                TreeNode temp=q.get(0);
                if(temp.left!=null){
                    q.add(temp.left);
                }        
                if(temp.right!=null){
                    q.add(temp.right);
                }
                q.remove(0); 
            }
            level+=1;
        }
        return list;
    }
}


编辑于 2024-01-01 17:50:45 回复(0)
java: 简单思路

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pRoot TreeNode类 
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> Print (TreeNode pRoot) {
        // write code here
        // 先正常按照层级收集
        ArrayList<ArrayList<Integer>> r = new ArrayList();
        levelWithRightGetV(pRoot,r,0);
        // 将偶数层级集合进行反转
        for(int i = 0; i < r.size(); i++) {
            if(i % 2 == 1) {
                revList(r.get(i));
            }
        }
        return r;
    }

    public void revList(List<Integer> vs) {
        int size = vs.size() / 2;
        for(int i = 0; i < size; i++) {
            int temp = vs.get(i);
            vs.set(i,vs.get(vs.size() - 1 - i));
            vs.set(vs.size() - 1 - i,temp);
        }
    }

    public void levelWithRightGetV(TreeNode node,ArrayList<ArrayList<Integer>> r,int level) {
        if(node == null) {
            return;
        }
        if(level >= r.size()) {
            r.add(new ArrayList());
        }
        r.get(level).add(node.val);
        levelWithRightGetV(node.left,r,level + 1);
        levelWithRightGetV(node.right,r,level + 1);
    }

    
}

发表于 2023-10-15 18:46:34 回复(0)
public class Solution {
    /**
     * 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
     *
     *
     * @param pRoot TreeNode类
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> Print (TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        if (null == pRoot) {
            return result;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        ArrayList<Integer> currList = new ArrayList<>();
        queue.offer(pRoot);
        int rootSize = queue.size();//当前层数的总结点数
        while (!queue.isEmpty()) {
            TreeNode top = queue.poll();
            currList.add(top.val);
            if (top.left != null) {
                queue.offer(top.left);
            }
            if (top.right != null) {
                queue.offer(top.right);
            }
            //如果存储的结点数==当前总结点数
            if (currList.size() == rootSize) {
                result.add(currList);
                currList = new ArrayList<>();
                //队列size即为下层节点总数
                rootSize = queue.size();
            }
        }
        //单层反转
        for (int i = 0; i < result.size(); i++) {
            if (i % 2 > 0) {
                Collections.reverse(result.get(i));
            }
        }
        return result;
    }

}

发表于 2023-10-12 16:46:39 回复(0)
public class Solution {
    ArrayList<ArrayList<Integer>> result = new ArrayList<>();
    public ArrayList<ArrayList<Integer>> Print (TreeNode pRoot) {
        if (pRoot == null) {
            return result;
        }
        List<TreeNode> list = new ArrayList<>();
        list.add(pRoot);
        int level = 1;
        recursivePrint(list, level);
        return result;
    }

    private void recursivePrint(List<TreeNode> list, int level) {
        if (list.size() == 0) {
            return;
        }
        List<TreeNode> list02 = new ArrayList<>();
        ArrayList<Integer> ints = new ArrayList<>();
        boolean odd = (level & 1) == 1;
        for (int i = 0; i < list.size(); i++) {
            int i2 = odd ? i : list.size() - 1 - i;
            TreeNode node = list.get(i);
            ints.add(list.get(i2).val);
            if (node.left != null) {
                list02.add(node.left);
            }
            if (node.right != null) {
                list02.add(node.right);
            }
        }
        result.add(ints);
        recursivePrint(list02, level + 1);
    }
}
发表于 2023-09-19 19:03:59 回复(0)
用了Queue+Stack的组合,循环时总是从左到右读取,在需要反转顺序的时候才入栈

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param pRoot TreeNode类
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> Print (TreeNode pRoot) {
        // write code here
        ArrayList<ArrayList<Integer>> layers = new ArrayList<ArrayList<Integer>>();

        if (pRoot == null) {
            return layers;
        }

        ArrayList<Integer> layer = new ArrayList<Integer>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();

        // Initialize first node
        layer.add(pRoot.val);
        layers.add(layer);
        queue.offer(pRoot);
        boolean reverse = false;

        while (!queue.isEmpty()) {
            // Reverse flag
            reverse = !reverse;
            layer = new ArrayList<Integer>();

            Stack<Integer> stack = new Stack<Integer>();
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();

                // Loop for `node.left` and `node.right`
                for (int j = 0; j < 2; j++) {
                    TreeNode current = j < 1 ? node.left : node.right;
                    if (current != null) {
                        // System.out.println(
                        //     node.val + (j < 1 ? ".left = " : ".right = ") + current.val
                        // );

                        if (!reverse) {
                            // Append to result in ascending order
                            layer.add(current.val);
                        } else {
                            // Reverse order for current layer
                            stack.push(current.val);
                        }

                        // Add node to queue for next layer
                        queue.offer(current);
                    }
                }
            }

            // Reverse needed for the current layer
            while (!stack.isEmpty()) {
                layer.add(stack.pop());
            }

            if (layer.size() > 0) {
                layers.add(layer);
            }
        }

        return layers;
    }
}


发表于 2023-09-19 02:41:04 回复(0)
求助:找代码bug,Java
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
    Queue<TreeNode> queue = new LinkedList<>();
    if (pRoot != null) queue.offer(pRoot);
    ArrayList<ArrayList<Integer>> result = new ArrayList<>();
    while (!queue.isEmpty()) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < queue.size(); i++) { // 这个出来的list组不对
            //for (int i = queue.size() - 1; i >= 0; i--) {
            TreeNode node = queue.poll();
            list.add(node.val);
            if (node.left != null) {
                queue.offer(node.left);
            }
            if (node.right != null) {
                queue.offer(node.right);
            }
        }
        result.add(list);
    }
    for (int i = 0; i < result.size(); i++) {
        if ((i & 1) == 1) {
            Collections.reverse(result.get(i));
        }
    }
    return result;
}
while 里面的 for 循环,区间是 [0,queue.size-1],不知道为什么++写法跑出来是错的,--写是对的


发表于 2023-09-03 11:23:39 回复(0)
import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param pRoot TreeNode类
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> Print (TreeNode pRoot) {
        // write code here
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        // 定义两个栈,交替使用
        Stack<TreeNode> s1 = new Stack<>();
        Stack<TreeNode> s2 = new Stack<>();
        if (pRoot == null) {
            return res;
        }
        // 保证初始化s1有值
        s1.push(pRoot);
        // 每次把一个栈里的值全部取出,将子节点的值全部放入另一个栈,直到没有子节点
        while (!(s1.isEmpty() && s2.isEmpty())) {
            ArrayList<Integer> list = new ArrayList<>();
            // s2的栈为空,则说明是从左往右打印,奇数层
            if (s2.isEmpty()) {
                while (!s1.isEmpty()) {
                    TreeNode pop = s1.pop();
                    list.add(pop.val);
                    if (pop.left != null) {
                        s2.push(pop.left);
                    }
                    if (pop.right != null) {
                        s2.push(pop.right);
                    }
                }
            // s1的栈为空,说明从右往左打印,偶数层
            } else {
                while (!s2.isEmpty()) {
                    TreeNode pop = s2.pop();
                    list.add(pop.val);
                    if (pop.right != null) {
                        s1.push(pop.right);
                    }
                    if (pop.left != null) {
                        s1.push(pop.left);
                    }
                }
            }
            res.add(list);
        }

        return res;
    }
}
发表于 2023-08-15 09:37:53 回复(0)
import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param pRoot TreeNode类
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> Print (TreeNode pRoot) {
        // write code here
        ArrayList<ArrayList<Integer>> arraylists = new ArrayList<>();
        Deque<TreeNode> deque = new ArrayDeque<>();
        if (pRoot == null) {
            return arraylists;
        }
        deque.offerLast(pRoot);

        int index = 0;
        while (!deque.isEmpty()) {
            int size = deque.size();
            ArrayList<Integer> arrayList = new ArrayList<>();
            if (index % 2 == 0) {
                for (int i = 0; i < size; i++) {
                    TreeNode cur = deque.pollFirst();
                    if (cur.left != null) {
                        deque.offerLast(cur.left);
                    }
                    if (cur.right != null) {
                        deque.offerLast(cur.right);
                    }
                    arrayList.add(cur.val);
                }
            } else {
                for (int i = 0; i < size; i++) {
                    TreeNode cur = deque.pollLast();
                    if (cur.right != null) {
                        deque.offerFirst(cur.right);
                    }
                    if (cur.left != null) {
                        deque.offerFirst(cur.left);
                    }
                    arrayList.add(cur.val);
                }
            }
            arraylists.add(arrayList);
            index++;
        }
        return arraylists;
    }
}
发表于 2023-08-11 13:32:00 回复(0)
可以说是无敌做法   

public ArrayList<ArrayList<Integer>> Print (TreeNode root) {
        // write code here
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        if (root == null) return res;
        Queue<TreeNode> q = new ArrayDeque<TreeNode>();
        q.add(root);
        while (!q.isEmpty()) {
            ArrayList<Integer> row = new ArrayList<>();
            int n = q.size();
            ces++;
            for (int i = 0; i < n; i++) {
                TreeNode temp = q.poll();
                row.add(temp.val);
                    if (temp.left != null) q.add(temp.left);
                    if (temp.right != null) q.add(temp.right);
            }
            if(res.size()%2!=0){
                Collections.reverse(row);
            }
            res.add(row);
        }
        return res;
    }
发表于 2023-07-23 18:03:46 回复(0)
 public ArrayList<ArrayList<Integer>> Print (TreeNode pRoot) {
        // 注意这个出入的对称性
        // 从左到右,头出尾入
        // 从右到左,头入尾出 
        // 层序遍历  从左向右  从右向左
        Deque<TreeNode> qu=new LinkedList<>();
        ArrayList<ArrayList<Integer>> ans=new ArrayList<>();
        if(pRoot==null) return ans;
        qu.offer(pRoot);
        while(!qu.isEmpty()){
            //正序
            int level=qu.size();
            ArrayList<Integer> list=new ArrayList<>();
            for(int i=0;i<level;i++){
                TreeNode peek=qu.peekFirst();  //头出   从左到右
                list.add(qu.pollFirst().val);
                if(peek.left!=null) qu.offerLast(peek.left);//尾入
                if(peek.right!=null) qu.offerLast(peek.right);
            }
            ans.add(list);

            if(qu.isEmpty()) break;
            //倒序
            list=new ArrayList<>();
            level=qu.size();
            for(int i=0;i<level;i++){
                TreeNode tmp=qu.peekLast();//尾出   从右到左
                list.add(qu.pollLast().val);
                if(tmp.right!=null) qu.offerFirst(tmp.right);//头入
                if(tmp.left!=null) qu.offerFirst(tmp.left);
            }
            ans.add(list);
        }
        return ans;
    }

发表于 2023-07-23 12:23:17 回复(0)
import java.util.ArrayList;
import java.util.*;
/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        if(pRoot == null){
            return res;
        }
        Queue<TreeNode> q = new ArrayDeque<>();
        Stack<Integer> s = new Stack<>();
        int flag = 1;
        q.add(pRoot);
        while(!q.isEmpty()){
            ArrayList<Integer> row = new ArrayList<>();
            int n = q.size();
            for(int i = 0; i < n; i++){
                TreeNode cur = q.poll();
                row.add(cur.val);
                if(cur.left != null){
                    q.add(cur.left);
                }
                if(cur.right != null){
                    q.add(cur.right);
                }
            }
            if(flag % 2 == 0){
                for(int i = 0; i < n; i++){
                    s.push(row.get(i));
                }
                row.clear();
                while(!s.isEmpty()){
                    row.add(s.pop());
                }
            }
            flag++;
            res.add(row);
        }
        return res;
    }
}
发表于 2023-05-15 16:56:03 回复(0)
import java.util.ArrayList;

import java.util.Map;
import java.util.TreeMap;
import java.util.Optional;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> allNodes = new ArrayList<ArrayList<Integer>>();
        Map<Integer, ArrayList<Integer>> levelMap = new
        TreeMap<Integer, ArrayList<Integer>>();
        if (pRoot == null) {
            return allNodes;
        }
        int level = 0;
        ArrayList<Integer> levelNodes = Optional.ofNullable(levelMap.get(level)).orElse(
                                            new ArrayList<Integer>());
        levelNodes.add(pRoot.val);
        levelMap.put(level, levelNodes);
        find(levelMap, pRoot.left, level + 1);
        find(levelMap, pRoot.right, level + 1);
        for (Map.Entry<Integer, ArrayList<Integer>> entry : levelMap.entrySet()) {
            Integer lvl = entry.getKey();
            ArrayList<Integer> list = entry.getValue();
            if (lvl % 2 == 1) {
                allNodes.add(reverse(list));
            } else {
                allNodes.add(list);
            }
        }
        return allNodes;
    }

    public void find(Map<Integer, ArrayList<Integer>> levelMap, TreeNode node,
                     int level) {
        if (node == null) {
            return ;
        }
        ArrayList<Integer> levelNodes = Optional.ofNullable(levelMap.get(level)).orElse(
                                            new ArrayList<Integer>());
        levelNodes.add(node.val);
        levelMap.put(level, levelNodes);
        if (node.left == null && node.right == null) {
            return ;
        } else {
            find(levelMap, node.left, level + 1);
            find(levelMap, node.right, level + 1);
        }
        return;
    }

    public static ArrayList<Integer> reverse(ArrayList<Integer> nodes) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        for (int idx = nodes.size() - 1; idx >= 0; idx--) {
            res.add(nodes.get(idx));
        }
        return res;
    }
}

发表于 2023-05-08 11:49:23 回复(0)
import java.util.ArrayList;
import java.util.Collections;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        depth(pRoot,1,res);
        for (int i = 1; i < res.size(); i+=2) {
                Collections.reverse(res.get(i));
        }
        return res;
    }

    private void depth(TreeNode root,int d,ArrayList<ArrayList<Integer>> list){
        if(root==null) return;
        if(d>list.size()){
            list.add(new ArrayList<Integer>());
        }
        list.get(d-1).add(root.val);
        depth(root.left,d+1,list);
        depth(root.right,d+1,list);
    }
}

发表于 2023-05-04 11:07:44 回复(0)
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> arrayLists = new ArrayList<>();
        if (pRoot == null)
            return arrayLists;

        Queue<TreeNode> q = new ArrayDeque<>();
        q.add(pRoot);
        int ceilCount = 0;
        while (!q.isEmpty()) {
            ArrayList<Integer> ceilList = new ArrayList<>();
            int size = q.size();
            for (int i = 0; i < size; i++) {
                TreeNode cur = q.poll();
                ceilList.add(cur.val);
                if (cur.left != null)
                    q.add(cur.left);
                if (cur.right != null)
                    q.add(cur.right);
            }
            if (ceilCount % 2 != 1) {
                arrayLists.add(ceilList);
            } else {
                Collections.reverse(ceilList);
                arrayLists.add(ceilList);
            }
            ceilCount++;
        }
        return arrayLists;
    }

}

发表于 2023-03-10 17:32:40 回复(0)
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        if (pRoot == null) return res;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(pRoot);
        int row = 1;
        while (!queue.isEmpty()) {
            ArrayList<Integer> list = new ArrayList<>();
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                if (queue.peek().left != null) {
                    queue.offer(queue.peek().left);
                }
                if (queue.peek().right != null) {
                    queue.offer(queue.peek().right);
                }
                list.add(queue.poll().val);
            }
            if (row % 2 == 0) {
                Collections.reverse(list);
                //逆序list
                res.add(list);
            } else {
                res.add(list);
            }
            row++;
        }
        return res;
    }
发表于 2023-03-10 16:59:17 回复(0)
// 层次遍历
import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        if (pRoot == null) return new ArrayList<ArrayList<Integer>>();
        ArrayList<ArrayList<Integer>> arrayLists = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(pRoot);
        return depth(queue, true, arrayLists);
    }

    private ArrayList<ArrayList<Integer>> depth(Queue<TreeNode> queue, Boolean left,
            ArrayList<ArrayList<Integer>> arrayLists) {
        ArrayList<Integer> list = new ArrayList<>();
        Queue<TreeNode> qe = new LinkedList<>();
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            list.add(node.val);
            if (node.left != null) {
                qe.add(node.left);
            }
            if (node.right != null) {
                qe.add(node.right);
            }
        }
        if (list.size() > 0) {
            if (!left) {
                Collections.reverse(list);
            }
            arrayLists.add(list);
            return depth(qe, !left, arrayLists);
        } else {
            return arrayLists;
        }
    }
}

发表于 2023-03-08 14:15:25 回复(0)
public class Solution {
    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        if(pRoot==null) return res;
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(pRoot);
        int deepth = 0;
        while(!q.isEmpty()){
            int sizeLevel = q.size();
            ArrayList<Integer> resLevel = new ArrayList<>();
            while(sizeLevel-->0){
                pRoot = q.poll();
                if(deepth%2==0)resLevel.add(pRoot.val);
                else resLevel.add(0, pRoot.val);
                if(pRoot.left != null) q.offer(pRoot.left);
                if(pRoot.right != null) q.offer(pRoot.right);
            }
            res.add(resLevel);
            deepth++;
        }
        return res;
    }
}

发表于 2023-02-27 21:47:52 回复(0)