二叉樹的7種遍歷演算法

2021-10-24 13:44:23 字數 2020 閱讀 2381

中根遞迴遍歷演算法

後根遞迴遍歷演算法

先根非遞迴遍歷演算法

中根非遞迴遍歷演算法

後根非遞迴遍歷演算法

層序遍歷演算法

1.若二叉樹為空則退出,否則進行以下步驟

2.訪問當前的根節點

3.先根順序遍歷訪問左子樹

4.先根順序遍歷訪問右子樹

5.退出

public

static

void

proorder

(node t)

}

1.若二叉樹為空則退出,否則進行以下步驟

2.中根順序遍歷訪問左子樹

3.訪問當前的根節點

4.中根順序遍歷訪問右子樹

5.退出

public

static

void

inorder

(node t)

}

1.若二叉樹為空則退出,否則進行以下步驟

2.後根順序遍歷訪問左子樹

3.後根順序遍歷訪問右子樹

4.訪問當前的根節點

5.退出

public

static

void

postorder

(node t)

}

任何乙個遞迴演算法,我們都可以借助棧將其改造成非遞迴演算法!

這裡我們對以上三個遞迴演算法進行非遞迴改造,*即不會出現自己呼叫自己的現象*。

1.當前結點不為null或棧不空時,判斷當前結點是否為空

(1)不為空:訪問當前結點,然後將其入棧,並且將當前結點置為其左孩子結點

(2)為空:棧頂結點出棧(但不去訪問該節點),然後將當前結點置為出棧結點的右孩子結點

2.直到當前結點為null並且棧空時,遍歷結束並退出迴圈

public

static

void

proorder2

(node t)

else

}}

1.當前結點不為null或棧不空時,判斷當前結點是否為空

(1)不為空:將其入棧,並且將當前結點置為其左孩子結點

(2)為空:棧頂結點出棧,並去訪問出棧的結點,然後將當前結點置為出棧結點的右孩子結點

2.直到當前結點為null並且棧空時,遍歷結束並退出迴圈

public

static

void

inorder2

(node t)

else

}}

1.當前結點不為null或棧不空時,判斷當前結點是否為空

(1)不為空:將其入棧,並且將當前結點置為其左孩子結點

(2)為空:當棧頂元素的右孩子結點為null或者右子樹已經遍歷過時出棧並輸出,否則將當前結點置為棧頂結點的右孩子結點

2.直到當前結點為null並且棧空時,遍歷結束並退出迴圈

public

static

void

postorder2

(node t)

else

else}}

}

1.建立乙個佇列,並將根節點排隊

2.當佇列非空時,從佇列裡取出乙個結點並從佇列裡刪除,然後訪問該結點,最後若該節點的左孩子結點非空則排隊,右孩子結點非空則排隊。

3.當隊列為空時,退出迴圈,遍歷結束。

public

static

void

layerorder

(node t)

// 當右孩子結點非空時排隊

二叉樹遍歷演算法

二叉樹是一種非線性的資料結構,在對它進行操作時,總是需要逐一對每個資料元素實施操作,這樣就存在乙個操作順序問題,由此提出了二叉樹的遍歷操作。所謂遍歷二叉樹就是按某種順序訪問二叉樹中的每個結點一次且僅一次的過程。這裡的訪問可以是輸出 比較 更新 檢視元素內容等等各種操作。在這裡寫了個二叉樹遍歷演算法 ...

二叉樹學習之旅(7) 二叉樹遍歷

用到的演算法 1.函式push back,演算法語言裡面的乙個函式名用於在vector容器後面加乙個資料,v.push back val 如 1 c 中的vector標頭檔案裡面就有這個push back函式 2 在vector類中作用為在vector尾部加入乙個資料 3 string中也有這個函式...

鏈式二叉樹的7種遍歷方式

在說鏈式二叉樹的遍歷之前,我們先來說一下如何建立乙個鏈式二叉樹。建立乙個鏈式二叉樹,需要乙個已知的字串,這個字串必須支援建立二叉樹的規則。比如 我們通過遞迴來實現二叉樹的建立,開始先向左走,如果遇到 就返回,然後向右走,直到遇到 就返回乙個null,這樣,就完成了乙個鏈式二叉樹的建立。這裡先將除了主...