1. 程式人生 > >從上往下列印二叉樹(Java實現)

從上往下列印二叉樹(Java實現)

牛客網測試地址:https://www.nowcoder.com/questionTerminal/7fe2212963db4790b57431d9ed259701

從上往下打印出二叉樹的每個節點,同層節點從左至右列印。
package go.jacob.test426;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

public class Demo2 {
	//迴圈實現
	public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
		ArrayList<Integer> list=new ArrayList<Integer>();
		if(root==null)
			return list;
		
		Queue<TreeNode> queue=new LinkedList<TreeNode>();
		queue.add(root);
		while(!queue.isEmpty()){
			TreeNode node=queue.remove();
			list.add(node.val);
			if(node.left!=null)
				queue.add(node.left);
			if(node.right!=null)
				queue.add(node.right);
		}
		return list;
	}
	//遞迴實現
	public ArrayList<Integer> PrintFromTopToBottom_2(TreeNode root) {
		ArrayList<Integer> list=new ArrayList<Integer>();
		Queue<TreeNode> queue=new LinkedList<TreeNode>();
		if(root==null)
			return list;
		queue.add(root);
		print_2(list,queue);
		return list;
	}
	
	private void print_2(ArrayList<Integer> list, Queue<TreeNode> queue) {
		if(!queue.isEmpty()){
			TreeNode node=queue.remove();
			list.add(node.val);
			if(node.left!=null)
				queue.add(node.left);
			if(node.right!=null)
				queue.add(node.right);
		}else{
			return;
		}
	}



	/*
	 * 錯誤解法:要把左右子節點壓入佇列以後才能遞迴!
	 */
	private void print(TreeNode root,Queue<TreeNode> queue,ArrayList<Integer> list) {
		queue.add(root);
		TreeNode node=null;
		if(!queue.isEmpty()){
			node=queue.remove();
			list.add(node.val);
			if(node.left!=null)
				print(node.left,queue,list);
			if(node.right!=null)
				print(node.right,queue,list);
		}
	}

	public class TreeNode {
	    int val = 0;
	    TreeNode left = null;
	    TreeNode right = null;

	    public TreeNode(int val) {
	        this.val = val;

	    }

	}
}