按之字形順序列印二叉樹(java版)
阿新 • • 發佈:2019-02-02
【題目描述】請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。
【解題思路1】
1.使用兩個棧來分別儲存奇數層節點和偶數層節點。
2.注意兩個棧的插入順序是不同的。
3.對於奇數層來說,也就是從左往右的順序,先新增左子樹,然後新增右子樹。對於偶數層,剛好相反,先新增右子樹,然後新增左子樹。
import java.util.ArrayList; import java.util.Stack; public class Solution { public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { int level = 1; //s1存奇數層節點 Stack<TreeNode> s1 = new Stack<TreeNode>(); s1.push(pRoot); //s2存偶數層節點 Stack<TreeNode> s2 = new Stack<TreeNode>(); ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>(); while (!s1.empty() || !s2.empty()) { if (level%2 != 0) { ArrayList<Integer> temp = new ArrayList<Integer>(); while (!s1.empty()) { TreeNode node = s1.pop(); if(node != null) { temp.add(node.val); s2.push(node.left); s2.push(node.right); } } if (!temp.isEmpty()) { list.add(temp); level++; } } else { ArrayList<Integer> temp = new ArrayList<Integer>(); while (!s2.empty()) { TreeNode node = s2.pop(); if(node != null) { temp.add(node.val); s1.push(node.right); s1.push(node.left); } } if (!temp.isEmpty()) { list.add(temp); level++; } } } return list; } }
【解題思路2】
1. 層序遍歷
2.當遍歷到奇數層時,從左到右儲存該層遍歷的值。當遍歷到偶數層時,從右到左儲存該層遍歷的值。
public class Solution { public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> layers = new ArrayList<ArrayList<Integer>>(); if (pRoot == null) return layers; Deque<TreeNode> queue = new LinkedList<TreeNode>(); queue.offer(pRoot); int depth = 0; while (!queue.isEmpty()) { depth ++; ArrayList<Integer> layer = new ArrayList<Integer>(); int cur = 0, size = queue.size(); if ((depth & 1) == 0) { //如果是偶數層倒序新增 Iterator<TreeNode> it = queue.descendingIterator(); while (it.hasNext()) { layer.add(it.next().val); } } else { //如果是奇數層正序新增 Iterator<TreeNode> it = queue.iterator(); while (it.hasNext()) { layer.add(it.next().val); } } while (cur < size) { TreeNode node = queue.poll(); if (node.left != null) { queue.offer(node.left); } if (node.right != null) { queue.offer(node.right); } cur ++; } layers.add(layer); } return layers; } }