劍指offer:從上往下列印二叉樹
阿新 • • 發佈:2018-12-19
題目描述
從上往下打印出二叉樹的每個節點,同層節點從左至右列印。
實際考察樹的層次遍歷(廣度優先遍歷)演算法,從上往下遍歷二叉樹,本質上就是廣度優先遍歷二叉樹。 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()); } }