之字形打印二叉树

题目

实现一个函数按照“之”字型打印二叉树,即第一行按照从左到右顺序打印,第二行按照从右到左顺序打印,第三行按照从左到右顺序打印,依次类推。

例如

 

输出:

1

3 2

4 5 6 7

15 14 13 12 11 10 9 8

二叉树数据结构:

class TreeNode{
    public int value;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int a){
        value = a;
        left = null;
        right = null;
    }
}

 

思路

本题与二叉树的层序遍历有相同之处,也有不同之处。相同在于一层一层遍历,不同之处在于不同层会改变遍历顺序。

可以使用举例子的方法来思考解决方法,发现每变一层会改变顺序并且逆序输出,所以考虑用栈的结构来存储。再通过举例子发现第一层和第三层存储下一层时都是先存左节点,后存右节点。而第二层和第四层存储下一层都是先右节点后左节点,所以使用两个栈来存储。

代码

public static void print(TreeNode t) {

    if (t == null) return;

    Stack<TreeNode>[] stacks = new Stack[2];

    stacks[0] = new Stack<>();

    stacks[1] = new Stack<>();

    int current = 0;

    int next = 1;

    stacks[current].push(t);

    while(!stacks[current].isEmpty() || !stacks[next].isEmpty()){

        TreeNode temp = stacks[current].pop();

        System.out.print(temp.value + " ");

        if(current == 0){

            if(temp.left != null)stacks[next].push(temp.left);

            if(temp.right != null)stacks[next].push(temp.right);

        } else{

            if(temp.right != null)stacks[next].push(temp.right);

            if(temp.left != null)stacks[next].push(temp.left);

        }

        if(stacks[current].isEmpty()){

            System.out.println();

            current = 1 - current;

            next = 1 - next;

        }

    }

}

 

测试和结果

public static void main(String args[]) {

    TreeNode t1 = new TreeNode(1);

    TreeNode t2 = new TreeNode(2);

    TreeNode t3 = new TreeNode(3);

    TreeNode t4 = new TreeNode(4);

    TreeNode t5 = new TreeNode(5);

    TreeNode t6 = new TreeNode(6);

    TreeNode t7 = new TreeNode(7);

    TreeNode t8 = new TreeNode(8);

    TreeNode t9 = new TreeNode(9);

    TreeNode t10 = new TreeNode(10);

    TreeNode t11 = new TreeNode(11);

    TreeNode t12 = new TreeNode(12);

    TreeNode t13 = new TreeNode(13);

    TreeNode t14 = new TreeNode(14);

    TreeNode t15 = new TreeNode(15);

    t1.left = t2;

    t1.right = t3;

    t2.left = t4;

    t2.right = t5;

    t3.left = t6;

    t3.right = t7;

    t4.left = t8;

    t4.right = t9;

    t5.left = t10;

    t5.right = t11;

    t6.left = t12;

    t6.right = t13;

    t7.left = t14;

    t7.right = t15;

    print(t1);

}

输出:

 

总结

对于二叉树或者图的数据结构题目,可以使用画图和举例子的方式模拟输出过程,发现规律,再根据每次循环统一的规律来编写程序。这样的方法会使分析过程更具体化。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值