二叉树的前序、中序、后续、层序遍历(包含递归与非递归)
遞歸形式
遞歸形式遍歷比較簡單,不做詳細論述。
前序遍歷
中序遍歷
} void Inorder(treenode* root) //中序 {if (root != NULL){ Inorder(root->left);printf("%c", root->data);Inorder(root->right);}}后序遍歷
void Postorder(treenode* root) //后序 {if (root != NULL){Postorder(root->left);Postorder(root->right);printf("%c", root->data);} }非遞歸形式
前序遍歷
開始不斷向左孩子遍歷并入棧,在入棧的同時打印節(jié)點數(shù)據(jù),直到左孩子為空,此時獲取棧頂節(jié)點,并將其出棧,判斷其有無右孩子,如果無右孩子,就再次獲取棧頂節(jié)點并出棧,重復(fù)上述操作;如果有右孩子就將其入棧,并不斷遍歷其左孩子直到為空,重復(fù)上述操作,直到棧為空。
中序遍歷
從根節(jié)點開始不斷向左孩子遍歷并入棧,直到為空,只要沒有左孩子就出棧,在出棧的同時就打印節(jié)點數(shù)據(jù),此時在判斷出棧節(jié)點是否有右孩子,如果有右孩子重復(fù)上述操作繼續(xù)向左孩子遍歷,如果沒有就出棧,重復(fù)上述操作判斷有無右孩子,直到棧為空就退出遍歷。
后序遍歷
后續(xù)在理解上較為難,用兩個棧s1,s2更為直觀,便于理解。
首先將根節(jié)點放入s2,再將其左右孩子放入s1中,一定要先放入左孩子,再放入右孩子,此時在獲取s1棧頂節(jié)點并出棧,判斷其是否有左右孩子,只要有孩子就將該節(jié)點入棧s2,并將該節(jié)點左右孩子放入s1中;如果該節(jié)點無左右孩子那么直接出棧s2并入棧s1,重復(fù)上述操作直到s1為空,在將s2從棧頂打印到棧底便是后續(xù)遍歷
層序遍歷
層序遍歷需要用到隊列,先入隊根節(jié)點,在出隊,將其左右孩子入隊,依次出隊入隊操作,只要該節(jié)點有孩子就入隊,再出隊的同時打印節(jié)點數(shù)據(jù)
總結(jié)
以上是生活随笔為你收集整理的二叉树的前序、中序、后续、层序遍历(包含递归与非递归)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pyqt5中的lineEdit中只输入数
- 下一篇: 简易花式流水灯