zoukankan      html  css  js  c++  java
  • 剑指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;
        }
    }
  • 相关阅读:
    c++中stl函数的使用
    java 中String类的常见方法和StringBuffer类的使用
    c++模板类和模板函数
    c++简单工厂类的设计模式
    Android自定义的button按钮
    c++基类与派生类之间的转换
    Unity和Android结合出现Unabled to convert class into dex format
    jz2240用tftp下载程序步骤
    解决jz2440不能ping同主机问题
    android中的事件传递机制
  • 原文地址:https://www.cnblogs.com/haimishasha/p/11520969.html
Copyright © 2011-2022 走看看