剑指Offer | 32 - 3 之字形打印二叉树

剑指Offer 32 - 3 之字形打印二叉树

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


例如:下面一棵二叉树:

image.png


按照之字形打印的结果:


分析:

规律:按之字形顺序打印二叉树需要两个栈。我们在打印某一层的节点时,把下一层的子节点保存到相应的栈里。

如果当前打印的是奇数层(第一层、第三层等),则先保存左子节点再保存右子节点到第一个栈里;

如果当前打印的是偶数层(第二层、第四层等),则先保存右子节点再保存左子节点到第二个栈里。


由此代码为:

import java.util.Stack;

/*按之字形打印二叉树*/
public class Solution_32_03 {
    //之字形打印二叉树的函数
    public static void Print(TreeNode pRoot) {
        if (pRoot == null) {//当节点为空时
            return ;
        }
        
        //存奇数层的节点
        Stack<TreeNode> stack1 = new Stack<TreeNode>();
        
        //存偶数层的节点
        Stack<TreeNode> stack2 = new Stack<TreeNode>();

        //层数
        int layer = 1;
        
        //将根结点先 push 进 stack1 中
        stack1.push(pRoot);

        // stack1 或 stack2 有一个不为空时,执行下面的代码
        while (!stack1.isEmpty() || !stack2.isEmpty()) {
            
            if (layer % 2 != 0) {//当前层数为奇数层
               
                while (!stack1.isEmpty()) {//消耗 stack1 中的节点
                 
                    TreeNode node = stack1.pop();
                    System.out.print(node.val+" , ");
                    
                    //如果当前层为奇数层,则它子节点进栈的顺序是:左孩子先进,右孩子再进
                    if (node.left != null) {
                        stack2.push(node.left);
                    }
                  
                    if (node.right != null) {
                        stack2.push(node.right);
                    }
                }
             
                //当前层的节点消耗完成,层数加 1
                layer++;
                //换行
                System.out.println();

            }else {//当前层数为偶数层
             
                while (!stack2.isEmpty()) {//消耗 stack2 中的节点
                    
                    TreeNode node = stack2.pop();
                    System.out.print(node.val+" , ");

                    //如果当前层为偶数层,则它子节点进栈的顺序是:右孩子先进,左孩子再进
                    if (node.right != null) {
                        stack1.push(node.right);
                    }
                    
                    if (node.left != null) {
                        stack1.push(node.left);
                    }
                }
              
                //当前层的节点消耗完成,层数加 1
                layer++;
                 //换行
                System.out.println();
            }
        }
    }



    //二叉树的节点
    public static class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

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

        }

    }


    //测试主函数
    public static void main(String[] args) {
        TreeNode root1 = new TreeNode(1);
        root1.left = new TreeNode(2);
        root1.right = new TreeNode(3);
        root1.left.left = new TreeNode(4);
        root1.left.right = new TreeNode(5);
        root1.right.left = new TreeNode(6);
        root1.right.right = new TreeNode(7);
        root1.left.left.left = new TreeNode(8);
        root1.left.left.right = new TreeNode(9);
        root1.left.right.left = new TreeNode(10);
        root1.left.right.right = new TreeNode(11);
        root1.right.left.left = new TreeNode(12);
        root1.right.left.right = new TreeNode(13);
        root1.right.right.left = new TreeNode(14);
        root1.right.right.right = new TreeNode(15);
        
        Solution_32_03.Print(root1);

    }
}


输出结果:


image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值