60. 把二叉樹打印成多行(層次遍歷)

題目描述

從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。

Solution

  1. 遞歸,節點加入對應層數的list中
public class Solution {
	    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
	    	ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
	    	depth(pRoot, 1, ret);
	    	return ret;
	    }
	    
	    public void depth(TreeNode root, int depth, ArrayList<ArrayList<Integer>> list) {
	    	if (root == null) {
	    		return;
	    	}
	    	if (depth > list.size()) {
	    		list.add(new ArrayList<Integer>());
	    	}
	    	list.get(depth-1).add(root.val);
	    	depth(root.left, depth+1, list);
	    	depth(root.right, depth+1, list);
	    }
	}
  1. 非遞歸,用null標記每層的開始,或用start==end標記每層的結束,end爲每層的節點數
public class Solution {
	    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
	    	ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
	    	if (pRoot == null) {
	    		return ret;
	    	}
	    	Queue<TreeNode> q = new LinkedList<>();
	    	q.offer(null);
	    	q.offer(pRoot);
	    	ArrayList<Integer> list = new ArrayList<>();
	    	while (q.size() > 1) {
	    		TreeNode node = q.poll();
	    		if (node == null) {
	    			Iterator<TreeNode> iter = q.iterator();
	    			while (iter.hasNext()) {
	    			    TreeNode temp = iter.next();
	    				list.add(temp.val);
	    			}
	    			ret.add(new ArrayList<Integer>(list));
	    			list.clear();
	    			q.offer(null);
	    			continue;
	    		}
	    		if (node.left != null) {
	    			q.offer(node.left);
	    		}
	    		if (node.right != null) {
	    			q.offer(node.right);
	    		}	
	    	}	
	    	return ret;
	    }    
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章