59. 按之字形順序打印二叉樹

題目描述

請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。

Solution

  1. 利用Java中的LinkedList的底層實現是雙向鏈表的特點
    queue實現樹的層次遍歷,同時可以雙向遍歷,奇數層時從左向右遍歷,偶數層時從右向左遍歷
public class Solution {
	    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
	    	ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
	    	if (pRoot == null) {
	    		return ret;
	    	}
	    	LinkedList<TreeNode> queue = new LinkedList<>();
	    	ArrayList<Integer> list = new ArrayList<>();
	    	boolean leftToRight = true;
	    	queue.offerLast(null); //第一層開始
	    	queue.offerLast(pRoot);
	    	while (queue.size() != 1) {
	    		TreeNode node = queue.removeFirst();
	    		if (node == null) {    //遇到null遍歷null後的層
	    			Iterator<TreeNode> iter = null;
			        if (leftToRight) {
			        	iter = queue.iterator();
			        } else {
			        	iter = queue.descendingIterator();
			        }
			        leftToRight = !leftToRight;
			        while (iter.hasNext()) {
			        	TreeNode temp = iter.next();
			        	list.add(temp.val);
			        }
			        ret.add(new ArrayList<Integer>(list));
			        list.clear();
			        queue.offerLast(null);   //遍歷完當前層後加入下一次層的開始
			        continue;
	    		}
	    		if (node.left != null) {  //取當前層的孩子構建下一層節點
	    			queue.offerLast(node.left);
	    		}
	    		if (node.right != null) {
	    			queue.offerLast(node.right);
	    		}
	    	}
	    	return ret;
	    }
	}

2.用兩個棧對應奇數層和偶數層
s1奇數層從左向右,遍歷時將當前節點孩子以左、右順序放入s2
s2偶數層從右向左,遍歷時將當前節點孩子以右、左順序放入s1

public class Solution2 {
	    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
	    	ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
	    	if (pRoot == null) {
	    		return ret;
	    	} 
	    	Stack<TreeNode> s1 = new Stack<>();
	    	Stack<TreeNode> s2 = new Stack<>();
	    	int layer = 1;
	    	s1.push(pRoot);
	    	ArrayList<Integer> list = new ArrayList<>();
	    	while (!s1.empty()||!s2.empty()) {
	    		if (layer % 2 != 0) {  //奇數層遍歷s1,偶數層遍歷s2
	    			while (!s1.empty()) {
	    				TreeNode node = s1.pop();
	    				list.add(node.val);
	    				if (node.left != null) {  //奇數層節點孩子放入偶數層
	    					s2.push(node.left);
	    				}
	    				if (node.right != null) {
	    					s2.push(node.right);
	    				}
	    			}
	    			if (!list.isEmpty()) {
	    				ret.add(new ArrayList<Integer>(list));
	    				list.clear();
	    				layer++;
	    			}
	    		} else {
	    			while (!s2.empty()) {
	    				TreeNode node = s2.pop();
	    				list.add(node.val);
	    				if (node.right != null) {  //偶數層節點孩子放入奇數層
	    					s1.push(node.right);
	    				}
	    				if (node.left != null) {
	    					s1.push(node.left);
	    				}
	    			}
	    			if (!list.isEmpty()) {
	    				ret.add(new ArrayList<Integer>(list));
	    				list.clear();
	    				layer++;
	    			}
	    		}
	    	}
	    	return ret;	
	    }
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章