題目:有一棵二叉樹,請設計乙個演算法,按照層次列印這棵二叉樹。給定二叉樹的根結點root,請返回列印結果,結果按照每一層乙個陣列進行儲存,所有陣列的順序按照層數從上往下,且每一層的陣列內元素按照從左往右排列。保證結點數小於等於500。
思路:對於二叉樹,除了先序遍歷、中序遍歷、後序遍歷之外,常用的遍歷方式還有按層遍歷,即一層一層地進行遍歷,通常還要求在遍歷時攜帶行的資訊,例如一層遍歷完後要求列印換行符或者每一層都列印行號。
對於按層遍歷的理解:
1.按層遍歷屬於針對二叉樹的寬度優先遍歷問題(dfs)
2.對於圖的寬度優先遍歷,常常使用佇列結構來解決問題
3.面試中,按層遍歷常常對換行有所要求
其實按層遍歷很簡單,使用佇列就可以很容易的解決問題,佇列具有先進先出的特性,先放入的結點會先彈出,後放入的結點後彈出。如果不考慮遍歷時換行的問題,那麼按層遍歷很簡單,類似於先序遍歷,只是此時使用的額外資料結構是佇列而不是棧而已。
①先建立乙個佇列queue,可以直接使用queue類庫,也可以使用linkedlist鍊錶來實現佇列(linkedlist的poll方法用於從頭部刪除乙個物件並返回這個物件,相當於出隊;linkedlist的push方法用於在鍊錶的結尾加入乙個物件,相當於入隊,因此只要使用push和poll方法就可以實現對佇列的操作)
②建立乙個臨時變數cur表示當前正在訪問的結點,初始值cur=root
③首先將root入隊,然後開始迴圈過程,先從佇列中彈出乙個結點poll記作cur,然後進行2個動作:將cur.left放入佇列(如果不為空的話),將cur.right放入佇列(如果不為空的話);然後開始下一次迴圈:彈出乙個結點poll記作cur……依次進行直到queue.size()==0;
原理:從根結點開始,將根結點放入佇列①,之後彈出根結點①,每彈出乙個結點就先後將其左右結點②③放入佇列中,由於佇列先進先出,因此先取出的是②,然後將④⑤放入到佇列中,然後從佇列中取出乙個結點,由於佇列先進新出,此時取出的是之前放入的③,再將⑥⑦放入佇列……由於從第二層開始總是從左到有放入佇列,下一層的結點一定是在當前層的結點之後才放入並且也是從左到右放入的,因此總體順序必然是從上到下,從左到右的。
即只要記住,只要使用佇列來進行彈出和壓入操作就可以保證遍歷的順序是按層遍歷的。
while(queue.size()!=0)
}*///按層遍歷:屬於圖的寬度優先遍歷,需要使用佇列來輔助完成
public class treeprinter
if(temp.right!=null)
//判斷是否到邊
//如果到邊則換行,更新
if(temp==last)
}//雙重遍歷將結果取出放入到二維陣列中
int results2=new int[results.size()];
for(int i=0;i
按層列印二叉樹
二叉樹是一種常見的資料結構,由n 你 0 個節點構成,每個節點最多有兩個子二叉樹。由二叉樹的定義可知,一棵二叉樹由三部分組成 根節點 左子樹和右子樹。二叉樹的遍歷方式有先序遍歷 中序遍歷和後序遍歷。先序遍歷 首先訪問根節點,然後訪問根節點左孩子,再訪問根節點的右孩子。中序遍歷 首先訪問根節點左孩子,...
按層列印二叉樹
從上到下按層列印二叉樹,同一層結點從左至右輸出,每一層輸出一行 思路 1 廣度遍歷,利用佇列思想 2 要有2個佇列,分別存放當前層的節點 和 下一層的節點 class node 節點類 def init self,val self.val val self.left none self.right ...
按層遍歷二叉樹
include include typedef struct bitnodebitnode,bitree 定義二叉樹型別 typedef struct qnodeqnode,queueptr 建立鏈 typedef struct linkqueue 建立佇列 void enqueue linkque...