先定義關於棧的一些操作:initstack(s):初始化棧s isempty(s):判斷棧s是否為空 visit(p):訪問結點p push(s,p):將結點p壓入棧s中 pop(s,p):將棧頂結點從棧s中彈出並賦值給結點p gettop(s,p)訪問棧頂結點並賦值給結點p
寫**時根據結點的訪問順序進行思考。先序遍歷的訪問順序是根左右,具體的做法是:訪問入棧->向左->出棧向右。中序遍歷的訪問順序是左根右,具體的做法是:入棧向左->出棧訪問->向右。後序遍歷要注意辨別棧頂元素的右分支是否訪問過,後序遍歷的訪問順序是左右根,具體的做法是:入棧向左->棧頂判空判重向右入棧向左->出棧訪問置空。
結束迴圈的條件有兩個:p結點為空並且棧s為空(說明所有結點都已經訪問過)。
//先序遍歷
void preorder(bitree t)else }}
//順口溜:訪問入棧(根)向左(左)出棧向右(右)
//中序遍歷
void inorder(bitree t)else }}
//順口溜:入棧向左(左)出棧訪問(根)向右(右)
//後序遍歷
void postorder(bitree t)elseelse
} }}//順口溜: 入棧向左(左)棧頂判空判重向右入棧向左(右)出棧訪問置空(根)
二叉樹遍歷(遞迴 非遞迴)
二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。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次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...