1.先序遍歷(根左右),中序遍歷(左根右)和後序遍歷(左右根)都可以用遞迴實現,類似於dfs,左子樹都在右子樹之前遍歷,不同的是根的遍歷順序。層序遍歷則類似於bfs。
2.中序序列與先序序列、後序序列、層序序列中的任乙個結合都能重構二叉樹,但是沒有中序,兩外的任意兩個或三個組合都不能重構二叉樹,因為只有靠中序才能區分出左右子樹,而其他三種都只是提供根節點的。
3.二叉樹的先序中序後序遍歷。遍歷過程中經過節點的路線都一樣,只是訪問各節點的時機不同。先序是在第一次將節點入棧前訪問,中序則是在節點出棧時訪問。
後序遍歷非遞迴(比較重要):在出棧乙個節點後,要先判斷這個結點的左右孩子節點是否都出棧,若都已出棧,才能讓這個節點出棧。從下面的演算法中可以看到,要想訪問該節點,必須將該結點的所有祖先節點都壓入棧中後,才能訪問該節點。
也就是說訪問乙個節點p時,棧中節點恰好是p結點的所有祖先,從棧底到棧頂再加上p節點,正好是從根節點到p結點的一條路徑。很多演算法都會利用到上述特性:如求根節點到某節點的路徑,求兩個節點的最近公共祖先、輸出根結點到所有葉子結點的路徑等。
4.二叉樹的先序中序非遞迴演算法
將二叉樹根節點的所有左節點一一進棧,然後出棧乙個結點*p,*p沒有左孩子節點或者左孩子節點已經訪問過了,訪問該節點。然後將該結點的右孩子節點入棧,再重複上述操作,直到棧空為止。
void inorder2(node* root)
if(!s.empty())
} }二叉樹的後序遍歷非遞迴演算法:
//當用堆疊儲存節點時,必須分清返回根節點時,是從左子樹返回的還是右子樹返回的,所以設定乙個輔助指標r,r指向最近訪問過的節點。
void postorder2(node* root)
if(!s.empty())else
} } }
5.將層序遍歷中的佇列改為堆疊的話會怎樣?
如果將其改為堆疊,並且入棧順序改為先入右子節點再入左子節點,那麼其順序與先序遍歷一樣。
對於二叉樹的操作,很多都關於遍歷,要分別遍歷左節點,右節點,在遍歷左節點時,右節點怎麼辦呢,則需要資料結構來儲存,棧 或者佇列都行。而且先訪問右節點還是左節點,順序不同,要實現的功能也就不同。
6.樹和圖的區別
1.線性表可以是空表,樹可以是空樹,但圖不可以是空圖,圖中至少有乙個頂點,可以沒有邊。
2.樹是圖的子集,可以算是一種特殊的圖,樹存在一對多的關係,圖一對多和多對多都可以。
3.樹有乙個根節點,但是圖沒有。樹除根節點外每個節點只有乙個前驅,而圖沒有這種關係。樹沒有環,圖可以有環。樹n個頂點一定有n-1條邊,但是圖頂點和邊之間沒有確定關係。圖有不連通的情況,樹一定連通
4.樹有明顯的層次性,圖呈現的是網路性,更複雜的關係。
7.樹的遍歷和圖的遍歷區別
遍歷就是把節點按照一定規則構成線性序列,不同規則構成不同順序的序列而已。
1.樹的遍歷不需要設定vis陣列來標記是否訪問過。因為不管是先序(根左右)中序(左根右)後序(左右根),樹節點之間有明確的父親孩子關係,都一定只會遍歷一次。而圖各節點之間都只有相鄰關係,所以圖的遍歷都需要vis陣列來標記節點是否訪問過。
2.樹的遍歷一般以根節點開始,圖的遍歷可以任選節點。圖有不連通的情況,樹沒有。
二叉樹 先序 中序 後序
同學整理的,順便傳上分享下 一,已知先序和中序 求後序 1 include2 include3 include4 using namespace std 5char s1 10 s2 10 ans 10 6 int o 0 7 void tree int n char s1 char s2 char...
先序建立二叉樹及先序 中序 後序遍歷
先序二叉樹 先序建立二叉樹 void createbitree bitree t t bitnode malloc sizeof bitnode t data cnt t lchild null t rchild null createbitree t lchild createbitree t r...
先序中序後序二叉樹非遞迴實現
稍微解釋一下 先序遍歷。將根節點入棧,考察當前節點 即棧頂節點 先訪問當前節點,然後將其出棧 已經訪問過,不再需要保留 然後先將其右孩子入棧,再將其左孩子入棧 這個順序是為了讓左孩子位於右孩子上面,以便左孩子的訪問先於右孩子 當然如果某個孩子為空,就不用入棧了 如果棧非空就重複上述過程直到棧空為止,...