標籤:
演算法題目大都比較抽象,可以通過舉例子來搞清楚具體的邏輯。題目:
從上到下,按照從左往右列印二叉樹每一層的結點。
二叉樹的結點:
class BinaryTreeNode{ int mValue; BinaryTreeNode mLeft;; BinaryTreeNode mRight; }
思路:
- 我們發現規律:先遍曆的結點,它的子節點也會先被遍曆到,是一個先進先出的模型,考慮用隊列來實現。
- 沒遍曆一個結點時候,就把它的孩子結點取出來,放到隊列的尾部,然後重複這個過程,直到隊列為空白。
代碼:首先介紹一下java的隊列
隊列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。隊列中沒有元素時,稱為空白隊列。
在隊列這種資料結構中,最先插入的元素將是最先被刪除的元素;反之最後插入的元素將是最後被刪除的元素,因此隊列又稱為“先進先出”(FIFO—first in first out)的線性表。
Queue使用時要盡量避免Collection的add()和remove()方法,而是要使用offer()來加入元素,使用poll()來擷取並移出元素。它們的優點是通過傳回值可以判斷成功與否,add()和remove()方法在失敗的時候會拋出異常。 如果要使用前端而不移出該元素,使用
element()或者peek()方法。
LinkedList類實現了Queue介面,因此我們可以把LinkedList當成Queue來用。
amazing!!!
void printFromTopToBottom(BinaryTreeNode root){ if(root ==null) return; LinkedList<BinaryTreeNode> queue = new LinkedList<BinaryTreeNode>(); queue.offer(root); while(queue.size() > 0){ BinaryTreeNode tmp = queue.peek(); queue.poll(); System.out.println(tmp.mValue+""); if(tmp.mLeft != null){ queue.offer(tmp.mLeft); } if(tmp.mRight != null){ queue.offer(tmp.mRight); } } }
本題目擴充:
如何?圖的廣度優先遍曆呢?
也可以用隊列來實現。
樹是圖的一種退化形式,從上到下,按層遍曆二叉樹實際是一種廣度優先遍曆二叉樹。
結論:
不管是廣度優先遍曆一棵樹或圖,都要使用隊列。
- 第一步是把起始結點放入隊列。
- 從隊列頭部取出一個結點。取出每一個和這個結點相鄰的結點放入。
- 重複直到隊列是空的。
歡迎入群:公眾號IT面試題匯總討論群
如果掃描不進去,加我(rdst6029930)拉你。
歡迎關注《IT面試題匯總》訂閱號。每天推送經典面試題和面試心得技巧,都是乾貨!訂閱號二維碼如下:
http://my.csdn.net/u010321471
【36】按層列印二叉樹