leetcode-103-二叉樹的鋸齒形層次遍歷(binary tree zigzag level order traversal)-java
阿新 • • 發佈:2018-11-19
題目及測試
package pid103; import java.util.List; /* 二叉樹的鋸齒形層次遍歷 給定一個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。 例如: 給定二叉樹 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回鋸齒形層次遍歷如下: [ [3], [20,9], [15,7] ] }*/ public class main { public static void main(String[] args) { Object[] x=new Object[]{1,2,3,4,null,null,5}; BinaryTree tree=new BinaryTree(x); tree.printTree(tree.root); test(tree.root); Object[] x2=new Object[]{3,9,20,null,null,15,7}; BinaryTree tree2=new BinaryTree(x2); tree2.printTree(tree2.root); test(tree2.root); } private static void test(TreeNode ito) { Solution solution = new Solution(); List<List<Integer>> rtn; long begin = System.currentTimeMillis(); rtn = solution.zigzagLevelOrder(ito);//執行程式 long end = System.currentTimeMillis(); System.out.println("rtn=" ); for (List<Integer> list : rtn) { for (Integer integer : list) { System.out.print(integer+" "); } System.out.println(); } System.out.println(); System.out.println("耗時:" + (end - begin) + "ms"); System.out.println("-------------------"); } }
解法1(成功,2ms,較快)
使用典型的二叉樹層次化遍歷的方法,設定一個佇列逐個放入層次化的二叉樹,設定num,next變數控制層數,然後設定isLTR變數,表明該層的資料從左往右還是從右往左,如果從右往左,則每層遍歷的節點由於是從左往右,則塞入list的順序是插入頭部,導致最右的資料在list最左邊
package pid103; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { Queue<TreeNode> queue=new LinkedList<>(); List<List<Integer>> result=new ArrayList<>(); LinkedList<Integer> list=new LinkedList<>();//一排的integer if(root==null){ return result; } queue.add(root); int num=1; int next=0; boolean isLTR=true;//是否這一排順序從左到右 while(!queue.isEmpty()){ TreeNode now=queue.poll(); if(now.left!=null){ queue.add(now.left); next++; } if(now.right!=null){ queue.add(now.right); next++; } if(isLTR){ list.add(now.val); } else{ list.addFirst(now.val); } num--; if(num==0){ num=next; next=0; isLTR=!isLTR; result.add(list); list=new LinkedList<>(); } } return result; } }