面试题61:按之字形顺序打印二叉树

来源:互联网 发布:一个平台优化方案 编辑:程序博客网 时间:2024/06/18 06:36
题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路: 这道题看上去像是二叉树的层次遍历,但是又比二叉树的层次遍历复杂,先看下二叉树层次遍历的代码
import java.util.LinkedList;  public class LevelOrder  {    public void levelIterator(BiTree root)    {        if(root == null)        {            return ;        }        LinkedList<BiTree> queue = new LinkedList<BiTree>();        BiTree current = null;        queue.offer(root);//将根节点入队        while(!queue.isEmpty())        {            current = queue.poll();//出队队头元素并访问            System.out.print(current.val +"-->");            if(current.left != null)//如果当前节点的左节点不为空入队            {                queue.offer(current.left);            }            if(current.right != null)//如果当前节点的右节点不为空,把右节点入队            {                queue.offer(current.right);            }        }    }  }  

再来看这道题的代码, 思路都写在了代码里面

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> > resultLists = new ArrayList<ArrayList<Integer> >();        if(pRoot == null){            return resultLists;        }        //借助队列实现每一层遍历        Queue <TreeNode> queue = new LinkedList <TreeNode>();  //Queue是接口,一般用LinkedList实现        //借助栈实现偶数层便利结果的反转,其实就是队列的反转        Stack <TreeNode> stack = new Stack <TreeNode>();        int len  =1 ;  //len:打印的层数        TreeNode tmp = null;        queue.offer(pRoot);        while(!queue.isEmpty()){            //while循环代表整个二叉树的遍历             ArrayList<Integer> list = new  ArrayList<Integer>();   //创建数组保存每一层的节点            int size = queue.size();  //size代表每一层的节点个数            while(size-- >0){  //每一层遍历                tmp = queue.poll();                if((len&1) == 0){ //偶数层                    stack.push(tmp);                }else{ //奇数层                    list.add(tmp.val);                }                if(tmp.left!=null){                    queue.offer(tmp.left);                }                if(tmp.right!=null){                   queue.offer(tmp.right);                }           }            while(!stack.isEmpty()){               list.add(stack.pop().val);           }           //每一层遍历结束后           len++;            resultLists.add(list);        }        return resultLists;       }}
原创粉丝点击