程序员代码面试指南刷题--第三章.二叉树的按层打印与ZigZag打印

题目描述
给定一颗二叉树,分别实现按层和 ZigZag 打印二叉树。
ZigZag遍历: 意思是第一层从左到右遍历,第二层从右到左遍历,依次类推。
输入描述:

第一行输入两个整数 n 和 root,n 表示二叉树的总节点个数,root 表示二叉树的根节点。
以下 n 行每行三个整数 fa,lch,rch,表示 fa 的左儿子为 lch,右儿子为 rch。(如果 lch 为 0 则表示 fa 没有左儿子,rch同理)

输出描述:

先输出按层打印,再输出按ZigZag打印。

示例1

输入

8 1
1 2 3
2 4 0
4 0 0
3 5 6
5 7 8
7 0 0
8 0 0
6 0 0

输出

Level 1 : 1
Level 2 : 2 3
Level 3 : 4 5 6
Level 4 : 7 8
Level 1 from left to right: 1
Level 2 from right to left: 3 2
Level 3 from left to right: 4 5 6
Level 4 from right to left: 8 7

解法一:利用队列和双栈

import java.io.*;
import java.util.*;
public class Main{
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        br.readLine();
        TreeNode root = createTree(br);
        layerPrint(root);
        zigZag(root);
    }
    public static void zigZag(TreeNode root){
        if(root==null) return;
        Stack<TreeNode> s1 = new Stack<>();
        Stack<TreeNode> s2 = new Stack<>();
        s1.add(root);
        int level = 1;
        TreeNode node;
        StringBuilder sb;
        while(!s1.isEmpty()||!s2.isEmpty()){
            if(!s1.isEmpty()){
                sb = new StringBuilder();
                sb.append("Level "+level+" from left to right: ");
                while(!s1.isEmpty()){
                    node = s1.pop();
                    sb.append(node.val+" ");
                    if(node.left!=null){
                        s2.add(node.left);
                    }
                    if(node.right!=null){
                        s2.add(node.right);
                    }
                }
                level++;
                System.out.println(sb.toString().trim());
            }
            if(!s2.isEmpty()){
                sb = new StringBuilder();
                sb.append("Level "+level+" from right to left: ");
                while(!s2.isEmpty()){
                    node = s2.pop();
                    sb.append(node.val+" ");
                    if(node.right!=null){
                        s1.add(node.right);
                    }
                    if(node.left!=null){
                        s1.add(node.left);
                    }
                }
                level++;
                System.out.println(sb.toString().trim());
            }            
        }
    }
    public static void layerPrint(TreeNode root){
        if(root==null) return;
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        int presize = 1;
        int size = 0;
        int count = 1;
        while(!q.isEmpty()){
            StringBuilder sb = new StringBuilder();
            sb.append("Level "+count+" : ");
            while((presize--)>0){
                TreeNode node = q.poll();
                sb.append(node.val+" ");
                if(node.left!=null){
                    size++;
                    q.add(node.left);
                }
                if(node.right!=null){
                    size++;
                    q.add(node.right);
                }
            }
            presize = size;
            size = 0;
            count++;
            System.out.println(sb.toString().trim());
        }
    }
    //递归建树
    public static TreeNode createTree(BufferedReader br){
        try{
            String[] ss = br.readLine().trim().split(" ");
            int data = Integer.parseInt(ss[0]);
            int left = Integer.parseInt(ss[1]);
            int right = Integer.parseInt(ss[2]);
            TreeNode root = new TreeNode(data);
            if(left!=0){
                root.left = createTree(br);
            }
            if(right!=0){
                root.right = createTree(br);
            }
            return root;
        }catch(Exception e){
            return null;
        }
    }


}
class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
    public TreeNode(int val){
        this.val = val;
    }
}

发布了189 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44406146/article/details/105506655