二叉樹的非遞迴遍歷和遞迴遍歷

2022-06-10 02:12:08 字數 1491 閱讀 6696

前言

二叉樹的遍歷有前序遍歷、中序遍歷、後續遍歷、層序遍歷。然後我們分別實現一下各種遍歷的遞迴與非遞迴的方式,樹節點定義如下:

class treenode

前序遍歷

前序遍歷是指我們的二叉樹先遍歷root節點,然後遍歷左節點,最後是右節點

遞迴public void preorder(treenode root)while (root!= null || !stack.isempty());

後序遍歷

遞迴public void afterorder(treenode root)鄭州**哪家好

//借助兩個棧來實現,因為要先遍歷右孩子才能root節點,所以root節點要在s2的最底部

stack s1 = new stack<>();

stack s2 = new stack<>();

s1.push(root);

while (!s1.isempty()){

treenode node = s1.pop();

if (node.left != null){

s1.push(node.left);

if (node.right != null){

s1.push(node.right);

s2.push(node);

while (!s2.isempty()){

system.out.println(s2.pop().val);

層序遍歷

層序遍歷是指將二叉樹的節點一層一層的遍歷出來,這裡我假設將節點存入list,採用bfs的方式遍歷節點。

public list> levelorder(treenode root) {

//存訪每一層的結果

list> lists = new arraylist<>();

if (root == null){

return lists;

//借助佇列存放每一層的節點

queue queue = new linkedblockingqueue<>();

queue.add(root);

while (!queue.isempty()){

list list = new arraylist<>();

int size = queue.size();

//獲取當前佇列中的所有節點,然後將每個節點的左右孩子放入佇列,以提供下層迴圈輸出

for (int i = 0; i < size; i++) {

treenode node = queue.poll();

list.add(node.val);

if (node.left != null){

queue.add(node.left);

if (node.right != null){

queue.add(node.right);

//每一層的list存入lists

lists.add(list);

return lists;

二叉樹遞迴遍歷和非遞迴遍歷

用遞迴和非遞迴實現二叉樹的前序遍歷 中序遍歷和後序遍歷並列印出相應結果。private class treenode 在遞迴呼叫時候系統自動給我們建立棧來儲存資料,而使用非遞迴時候需要我們自己實現棧來儲存資料。遞迴實現前序遍歷public void preorder treenode root sy...

二叉樹的遞迴遍歷和非遞迴遍歷

二叉樹是一種基本的資料結構,在程式設計師面試中經常會被考察。其中按一定順序遍歷所有節點是最基本的操作,很多知名的面試題目,例如求二叉樹的深度 求出和為某一值的路徑等等,本質上都是遍歷的變種。本文試圖從遞迴和非遞迴的角度來考察一下遍歷的演算法。遍歷定義 在二叉樹中,每乙個節點都有左右兩個子節點 子節點...

二叉樹遍歷(遞迴和非遞迴)

二叉樹的中序遍歷 二叉樹的後序遍歷 測試二叉樹的節點定義如下 節點 二叉樹的前序遍歷順序為 根左右。如下圖所示,前序遍歷順序為 1245367。遞迴 public static void preorder treenode root system.out.print root.val preorde...