1. 程式人生 > >劍指offer:從上往下列印二叉樹

劍指offer:從上往下列印二叉樹

題目描述

從上往下打印出二叉樹的每個節點,同層節點從左至右列印。

實際考察樹的層次遍歷(廣度優先遍歷)演算法,從上往下遍歷二叉樹,本質上就是廣度優先遍歷二叉樹。             10           /      \          6         14         /\          /\       4  8     12  16 用按層遍歷二叉樹的方法,

(1)按層遍歷的順序決定首先應該列印根節點,所以從根節點10開始分析。 (2)列印完根節點10,要列印它的左右子節點6,14。所以在遍歷到左右子節點時,先將它們裝入容器中,此時容器記憶體了6,14 (3) 先列印左節點6,此時6的左右子節點4,8也進入了容器,容器內有3個元素,14,4,8 (4)從容器內取出14並列印,然後將14的左右子節點12,16存入容器中,此時容器中有4個元素,按順序是4,8,12,16 (5)容器中剩餘的元素是葉子結點,無左右節點,按順序從容器中依次取出並列印即可。 綜上分析,這種先進先出的容器,是佇列,所以我們利用佇列做臨時儲存器來完成列印。

操作步驟圖示:

                                                

程式碼1:

package com.day02;
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
//定義樹結構
class TreeNode{
	int val;
	TreeNode left;
	TreeNode right;
	TreeNode(int x){
		this.val=x;
	}
}

class PrinTreeDemo {
	 public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
		 ArrayList<Integer> list=new ArrayList<>();
		 Queue<TreeNode> queue=new LinkedList<TreeNode>();
		 if(root==null){
			 return list;
		 }
		 queue.offer(root);
		 while(!queue.isEmpty()){
			 TreeNode node=queue.poll();//移除並返回佇列頭部的元素
			 System.out.println(node.val);
			 list.add(node.val);
			 if(node.left!=null){
				 queue.offer(node.left);//offer():向佇列 新增元素並返回true
			 }
			 if(node.right!=null){
				 queue.offer(node.right);
			 }
			 
		 }
		return list;
		
	        
	    }
	 
	//設定指定根節點左孩子和右孩子的方法
	 public static void SetSubTreeNode(TreeNode root,TreeNode lChild,TreeNode rChild){
		 if(root==null){
			 return;
		 }
		 root.left=lChild;
		 root.right=rChild;
	 }

    //測試程式碼
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		TreeNode node1=new TreeNode(10);
		TreeNode node2=new TreeNode(16);
		TreeNode node3=new TreeNode(14);
		TreeNode node4=new TreeNode(4);
		TreeNode node5=new TreeNode(8);
		TreeNode node6=new TreeNode(12);
		TreeNode node7=new TreeNode(16);
		
		SetSubTreeNode(node1,node2,node3);
		SetSubTreeNode(node2,node4,node5);
		SetSubTreeNode(node3,node6,node7);
		
		PrinTreeDemo ptd=new PrinTreeDemo();
		ArrayList<Integer> list=ptd.PrintFromTopToBottom(node1);
		System.out.println(list.toString());
	

	}

}