二叉樹的遍歷本質上其實就是入棧出棧的問題,二叉樹的前序,中序,後序遍歷都需要棧這個結構。
首先我們使用#建立法,建立乙個二叉樹**如下:
上圖為所建立的二叉樹結構。
先序遍歷:先序遍歷是先輸出根節點,再輸出左子樹,最後輸出右子樹。上圖的先序遍歷結果就是: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次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...