二叉樹的非遞迴遍歷

2021-10-02 17:03:19 字數 1901 閱讀 8598

二叉樹的遍歷本質上其實就是入棧出棧的問題,二叉樹的前序,中序,後序遍歷都需要棧這個結構。

首先我們使用#建立法,建立乙個二叉樹**如下:

上圖為所建立的二叉樹結構。

先序遍歷:先序遍歷是先輸出根節點,再輸出左子樹,最後輸出右子樹。上圖的先序遍歷結果就是:abcdef

中序遍歷:中序遍歷是先輸出左子樹,再輸出根節點,最後輸出右子樹。上圖的中序遍歷結果就是:cbdaef

後序遍歷:後序遍歷是先輸出左子樹,再輸出右子樹,最後輸出根節點。上圖的後序遍歷結果就是:cdbfea

先序遍歷

**如下:

void

recur_node

(binarynode* root)

if(p->lchild !=

null)}

free

(temp)

;//釋放棧

}

總的來說就是先讓二叉樹的頭節點入棧,在迴圈中把棧是否為空作為二叉樹遍歷的終點,迴圈中先讓右子樹入棧後讓左子樹入棧,以此來滿足先序遍歷的條件。當棧為空時便意味著樹已經遍歷完成。

這個先序遍歷和層次遍歷**極其相似,只需要改變一下入隊順序,並將棧結構改為佇列便能進行層次遍歷。

中序遍歷

**如下:

void

inordernode

(binarynode* root)if(

!empty_stack

(temp)

)//判斷棧是否為空

}}

中序遍歷便是先將所有左子樹的節點入棧,之後,判斷棧是否為空,不為空,則將棧中取出一節點,列印,並將此節點的右子樹賦值給root。如此便能達到遍歷左子樹-》中間子樹-》右子樹。而當棧為空且樹節點到了右子樹的null處,便說明樹已經遍歷完成。

後序遍歷

**如下:

void

postordernode

(binarynode* root)

s =get_top

(temp)

;//將棧頂元素賦值給s

if(s->rchild ==

null

|| p == s->rchild)

//當滿足s的右子樹為空

//或者s的右節點為已遍歷過的節點,輸出s節點的值

else

}while

(temp->next !=

null);

//棧是否為空

}

後序遍歷方法有很多種,今天我寫的是一種比較簡單的方法。首先定義兩個變數用來儲存遍歷過的節點和儲存棧頂元素,利用這兩個變數來判斷是否遍歷過右子樹,以此來決定是否遍歷中間子樹。由於最後遍歷中間子樹的原因,所以只能利用棧為空的條件來做判斷。

**驗證過後也沒有問題。

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

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...

二叉樹非遞迴遍歷

二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...

非遞迴遍歷二叉樹

中序遞迴遍歷 void inordertrvdigui node pnode 然而,當樹的深度很大 比如16 時 假設為滿二叉樹 樹的節點數為 2 0 2 1 2 2 2 15 2 16 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...