【剑指offer】面试题32(3):之字形打印二叉树

来源:互联网 发布:photoshop cs软件下载 编辑:程序博客网 时间:2024/06/05 15:33

完整代码地址

完整代码地址

题目

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

思路

刚看到这个题目的时候,感觉很简单,还是用之前的做法,用队列来实现,然后用一个辅助栈,来对偶数行的进行压栈并出栈放到队列中。但是这个做法并不是最好的,代码实现起来较为复杂

更好的做法:
使用两个栈来解决这个问题。我们在打印某一层的节点时,把下一层的子节点保存到相应的栈里。
如果当前打印的是奇数层(第一层、第三层等),则先保存左子节点再保存右子节点到第一个栈里。
如果当前打印的是偶数层(第二层、第四层等),则先保存右子节点再保存左子节点到第二个栈里。

例如:
完全二叉树
1
2 3
4 5 6 7
8 9 10 11 12 13 14 15
首先将1保存在第一个栈stack1里,
然后对stack1进行依次出栈,并将出栈的节点的左子节点和右子节点依次入第二个栈stack2。即2和3依次进入stack2。
然后对stack2进行依次出栈,并将出栈的节点的右子节点和左子节点依次入第一个栈stack1。即7,6,5,4依次进入stack1。
然后对stack1进行依次出栈,并将出栈的节点的左子节点和右子节点依次入第二个栈stack2。即8,9,10,11,12,13,14,15依次进入stack2。
然后对stack2进行依次出栈,因为子节点为null,所以没有再进栈。遍历结束。

代码

/** * 请实现一个函数按照之字形打印二叉树, * 即第一行按照从左到右的顺序打印, * 第二层按照从右至左的顺序打印, * 第三行按照从左到右的顺序打印,其他行以此类推。 *  * @author peige */public class _32_03_PrintTreesInZigzag {    public static class TreeNode {        public int val = 0;        public TreeNode left = null;        public TreeNode right = null;        public TreeNode(int val) {            this.val = val;        }    }    public static ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {        if(pRoot == null)            return new ArrayList<>();        ArrayList<ArrayList<Integer>> result = new ArrayList<>();        ArrayList<Integer> lineResult = new ArrayList<>();        LinkedList<TreeNode> oddLineStack = new LinkedList<>();     // 奇数行        LinkedList<TreeNode> evenLineStack = new LinkedList<>();    // 偶数行         boolean isOddLineNow = true;    // 正在遍历的是奇数行还是偶数行        oddLineStack.addFirst(pRoot);        while(!oddLineStack.isEmpty() || !evenLineStack.isEmpty()) {            if(isOddLineNow) {                while(!oddLineStack.isEmpty()) {                    TreeNode node = oddLineStack.removeFirst();                    lineResult.add(node.val);                    if(node.left != null)                        evenLineStack.addFirst(node.left);                    if(node.right != null)                        evenLineStack.addFirst(node.right);                }                isOddLineNow = false;                result.add(lineResult);                lineResult = new ArrayList<>();            }            else {                while(!evenLineStack.isEmpty()) {                    TreeNode node = evenLineStack.removeFirst();                    lineResult.add(node.val);                    if(node.right != null)                        oddLineStack.addFirst(node.right);                    if(node.left != null)                        oddLineStack.addFirst(node.left);                }                isOddLineNow = true;                result.add(lineResult);                lineResult = new ArrayList<>();            }        }        return result;    }}

测试

public class _32_03_Test {    public static void main(String[] args) {        test1();        test2();        test3();    }    /**     * 功能测试     *     1     *    / \     *   2   3     *  / \   \     * 4   5   6     */    private static void test1() {        TreeNode root = new TreeNode(1);        TreeNode node2 = new TreeNode(2);        TreeNode node3 = new TreeNode(3);        TreeNode node4 = new TreeNode(4);        TreeNode node5 = new TreeNode(5);        TreeNode node6 = new TreeNode(6);        root.left = node2;        root.right = node3;        node2.left = node4;        node2.right = node5;        node3.right = node6;        System.out.println(_32_03_PrintTreesInZigzag.Print(root));    }    /**     * 边界测试     * 1.只有一个节点     * 2.每个节点都只有左子节点     * 3.每个节点都只有右子节点     */    private static void test2() {        TreeNode root = new TreeNode(1);        System.out.println(_32_03_PrintTreesInZigzag.Print(root));        TreeNode node2 = new TreeNode(2);        TreeNode node3 = new TreeNode(3);        root.left = node2;        node2.left = node3;        System.out.println(_32_03_PrintTreesInZigzag.Print(root));        root.left = null;        node2.left = null;        root.right = node2;        node2.right = node3;        System.out.println(_32_03_PrintTreesInZigzag.Print(root));    }    /**     * 极端测试      * null     */    private static void test3() {        System.out.println(_32_03_PrintTreesInZigzag.Print(null));    }}
阅读全文
0 0