二叉樹是一種常見的資料結構,由n(你》=0)個節點構成,每個節點最多有兩個子二叉樹。
由二叉樹的定義可知,一棵二叉樹由三部分組成:根節點、左子樹和右子樹。二叉樹的遍歷方式有先序遍歷、中序遍歷和後序遍歷。
先序遍歷:首先訪問根節點,然後訪問根節點左孩子,再訪問根節點的右孩子。
中序遍歷:首先訪問根節點左孩子,然後訪問根節點,在訪問根節點的右孩子。
後序遍歷:首先訪問根節點左孩子,然後訪問根節點的右孩子,再訪問根節點。
上述三種遍歷方式原理相同,可以採用遞迴的方式實現遍歷。
這裡要說的是二叉樹的另一種遍歷方法:按層遍歷。
按層遍歷即從二叉樹的根節點開始從上至下從左至右依次訪問節點。
在介紹按層遍歷的實現前先定義一下二叉樹的結構。
class
treenode
}
上述**即定義了二叉樹中每個節點的結構。節點的資料 val、該節點的左孩子 left和該節點的有孩子right。
下面以乙個例項問題實現二叉樹的按層遍歷。
按層遍歷演算法如下:
1、初始化設定乙個佇列;
2、把根節點先入佇列;
3、當佇列非空時:
①、出佇列取得當前隊頭結點,訪問該節點;
②、若該結點的左孩子結點非空,則將該結點的左孩子結點放入佇列。
③、若該結點的右孩子結點非空,則將該結點的右孩子結點放入佇列。
4、結束
問題給定二叉樹的根結點root,請返回列印結果,結果按照每一層乙個陣列進行儲存,所有陣列的順序按照層數從上往下,且每一層的陣列內元素按照從左往右排列。
/**
* 二叉樹的按層遍歷
* *@param root
* 二叉樹的根節點
*@return 返回乙個二維陣列表示每一層由哪些資料構成
*/public
static
int printtree(treenode root)
// 作用1:儲存每一層的資料集合
// 作用2:轉化為陣列返回
arraylist> array = new arraylist<>();
// 臨時存放每層結點
arraylisttemp;
int last = 0;
int nlast = 0;
// 當前結點
treenode curr;
queuequeue = new linkedlist<>();
// 步驟1 :根節點入佇列
curr = root;
queue.offer(curr);
nlast = curr.val;
last = nlast;
temp = new arraylist<>();
// 步驟二 : 迴圈遍歷二叉樹
while (!queue.isempty())
// 右孩子非空,將右孩子入佇列
if (curr.right != null)
if (curr.val == last)
}// 將array中的結點資料轉換為二維陣列返回
int result = new
int[array.size()];
for (int i = 0; i < result.length; i++)
}return result;
}
按層列印二叉樹
從上到下按層列印二叉樹,同一層結點從左至右輸出,每一層輸出一行 思路 1 廣度遍歷,利用佇列思想 2 要有2個佇列,分別存放當前層的節點 和 下一層的節點 class node 節點類 def init self,val self.val val self.left none self.right ...
二叉樹3 二叉樹按層遍歷列印
題目 有一棵二叉樹,請設計乙個演算法,按照層次列印這棵二叉樹。給定二叉樹的根結點root,請返回列印結果,結果按照每一層乙個陣列進行儲存,所有陣列的順序按照層數從上往下,且每一層的陣列內元素按照從左往右排列。保證結點數小於等於500。思路 對於二叉樹,除了先序遍歷 中序遍歷 後序遍歷之外,常用的遍歷...
按層列印二叉樹 每行列印一層
一,問題介紹 給定一棵二叉樹,按照層序遍歷的順序列印二叉樹。但是要求,每一行列印一層資料。二,演算法分析 借助二叉樹的層序遍歷來實現 使用佇列的先入先出性質保證列印的順序 二叉樹層序遍歷參考 層序列印參考 1 public void printtree binarynoderoot 21if cur...