• 剑指offer:按之字形打印二叉树(栈|双向队列+中序遍历)


    1. 题目描述

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

    2. 双向队列

    /*思路:利用Java中的LinkedList的底层实现是双向链表的特点。
      1)可用做队列,实现树的层次遍历
      2)可双向遍历,奇数层时从前向后遍历,偶数层时从后向前遍历
    */

    3. 代码(双向链表+层次遍历)

    import java.util.*;
    
    public class Solution {
        public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
            return levelorder(pRoot);
        }
         public static ArrayList<ArrayList<Integer>> levelorder(TreeNode root) {
            Queue<TreeNode> queue = new LinkedList<>();
            ArrayList<ArrayList<Integer>> result = new ArrayList<>();
            if(root == null) return result;
            queue.offer(root); // 首先将根节点root入队
            int level = 0;//记录层数
            while (!queue.isEmpty()) {// Queue不为空则循环
                LinkedList<Integer> node = new LinkedList<>();// 保存每一层节点的值
                int length = queue.size();// 每一层的节点数目
                while (length > 0) {
                    TreeNode tree = queue.poll();
                    if (tree.left != null) {
                        queue.offer(tree.left);
                    }
                    if (tree.right != null) {
                        queue.offer(tree.right);
                    }
                    if((level+1)%2==0){
                        node.addFirst(tree.val);
                    }else{
                        node.add(tree.val);
                    }
                    
                    length--;
                }
                
                // node为本层遍历结果
                // 将linkedlist转成 ArrayList
                ArrayList<Integer> arrayNode = new ArrayList<>();
                for (Integer i: node) {
                    arrayNode.add(i);
                }
                result.add(arrayNode);
                //循环结束后,得到的Queue为下一层做准备,
                level++;
            }
            return result;
        }
    }
  • 相关阅读:
    Android开发:关于WebView
    PHP+JQUEY+AJAX实现分页
    Bootstrap入门(二)栅格
    BootStrap入门教程 (一)
    mac 终端命令
    没有功能需求设计文档?对不起,拒绝开发!
    React 入门教程
    Webpack+React+ES6开发模式入门指南
    webpack2.0+ vue2.0
    一个小时学会jQuery
  • 原文地址:https://www.cnblogs.com/haimishasha/p/11520969.html
Copyright © 2020-2023  润新知