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

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

分析:读完题,可以确定本题是用树的层次遍历做,无非就是变形的层次遍历。

首先,第一行从左到右顺序打印,即根结点。从第二层开始,需要从右往左顺序打印,即先打印右结点,在打印左结点,看起来是层次遍历的先进后出,因此可以用栈来实现。打印第三层时,需要从左往右打印,则最右结点应先进栈,最左结点后进栈,因此可以确保左结点先出栈,从左往右打印。值得注意,应该用两个栈来分别保存从左往右打印的和从右往左打印的。

当打印的层数为奇数层时,是从左往右打印,则它们的子节点(位于偶数层)应该从左往右进栈,因为它们是从右往左打印;

当打印的层数为偶数层时,是从右往左打印,则它们的子节点(位于奇数层)应该从右往左进栈,因为它们是从左往右打印。

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */

public class Solution {
    /**
     * @param root: A Tree
     * @return: A list of lists of integer include the zigzag level order traversal of its nodes' values.
     */
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        // write your code here
        List<List<Integer>> list=new ArrayList<>();
        if(root==null) return list;
        LinkedList<TreeNode> linkedList1=new LinkedList<>();  //保存从左往右进栈的,从右往左出栈
        LinkedList<TreeNode> linkedList2=new LinkedList<>();  //保存从右往左进栈的,从左往右出栈
        linkedList2.push(root);
        int count=0,nextcount=1,depth=1;
        List<Integer> sublist=new ArrayList<>();
        while(linkedList1.size()!=0 || linkedList2.size()!=0){
            if(depth%2==1){  //打印奇数层,下一层节点从左往右进栈,从右往左出栈输出
                TreeNode top=linkedList2.pop();
                sublist.add(top.val);
                count++;
                if(top.left!=null){
                    linkedList1.push(top.left);
                }
                if(top.right!=null){
                    linkedList1.push(top.right);
                }
                if(count==nextcount){
                    depth++;
                    count=0;
                    nextcount=linkedList1.size();
                    list.add(new ArrayList<>(sublist));
                    sublist.clear();  //清空sublist元素
                }
            }else{ //打印偶数层,下一层节点从右往左入栈,从左往右出栈
                TreeNode top=linkedList1.pop();
                sublist.add(top.val);
                count++;
                if(top.right!=null){
                    linkedList2.push(top.right);
                }
                if(top.left!=null){
                    linkedList2.push(top.left);
                }
                if(count==nextcount){
                    depth++;
                    count=0;
                    nextcount=linkedList2.size();
                    list.add(new ArrayList<>(sublist));
                    sublist.clear();
                }
            }
        }
        return list;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值