二叉樹是一種特殊的樹,二叉樹只有兩個分支,分別是該節點的左兒子和右兒子。
前序遍歷:就是先遍歷根節點,然後再訪問左子樹與右子樹。遍歷子樹的時候同樣也是先遍歷根節點然後在遍歷他的左子樹與右子樹。
中序遍歷:先遍歷左子樹,在遍歷根節點,最後遍歷右子樹。
後序遍歷:先遍歷左子樹與右子樹,在遍歷根節點。
因為有這樣的特點所以可以通過中序序列與後序或前列序列來確定乙個二叉樹。
乙個二叉樹的前序序列為abdecf
後序序列為dbeacf
由前序序列的特點我們知道前序序列第乙個節點一定是該樹的根節點,這樣在中序序列中尋找與根節點相同的點,以根節點在中序序列的位置為界限,記為l1,左邊就是左子樹的中序遍歷,右邊就是右子樹中序遍歷,此時根節點在中序序列中的位置,就是前序序列中遍歷完左子樹加上根節點的最後乙個位置,記為l2,此時,在先序序列中除去第乙個節點(因為第乙個節點是根節點,不屬於子樹),一直到l,包括l都是左子樹,而且是左子樹的前序序列。
使用上述兩個序列來還原二叉樹。
這時可以看出a是樹的根節點,在bde與dbe分別是左子樹的前序序列和中序序列,cf就是右子樹的先序序列和中序序列,這樣再以新生成的前序序列與中序序列再次進行找根節點並且分割左右子樹的操作,這樣直到兩顆子樹都只有乙個節點時,此時說明這個節點是葉子節點也就是遍歷完成。
這樣一直進行下去,直到左子樹和右子樹都只剩下乙個節點(這時子樹就是葉子節點,將其輸出後,這個方向的子樹就全部遍歷完全)。
void btree::
builttree
(char
*s1,
char
*s2,
int len)
//s1是前序序列,s2是後序序列,len是兩個序列的長度,s1的長度一定等於s2的長度
for(
;l)//l恰好記錄著根節點在中序遍歷的位置,從而可以判斷出左子樹,右子樹的長度
}builttree
(s1+
1,s2,l)
;//此次遞迴為左子樹遞迴
builttree
(s1+l+
1,s2+l+
1,len-l-1)
;//此次遞迴為右子樹遞迴
cout<<
*s1;
//因為我要實現的是後序遍歷,所以輸出s1在後面,中序的話在左子樹與右子樹的中間,前序在二者之前
}
由中序和後序(前序)序列求前序(後序)序列
已知二叉樹的中序和後序 前序 序列可以唯一確定一顆二叉樹,例如,中序序列 1 2 3 4 5 6 後序序列 3 4 2 6 5 1 可以唯一確定一顆二叉樹,如下圖 思路是這樣的 我們知道對於一顆二叉樹,根節點是後序遍歷序列的最後乙個,找到根節點後,我們由中序遍歷的特點知道,中序序列中,根節點 左邊的...
二叉搜尋樹的前序遍序序列 仿後序
實現功能 給定乙個序列,判斷是否是乙個搜尋樹的前序序列,如果是輸出 yes 反之輸出 no 要解決的問題和題目 類似 注 這裡考慮嚴格的二叉搜尋樹,即左子樹上的值全部小於根,右子樹上的值全部大於根,不存在相等情況,兩兩不同。include include includeusing namespace...
二叉樹的前序序列 中序序列 後序序列 層次序列
前序序列 根 左子樹 右子樹,中序序列 左子樹 根 右子樹,後序序列 左子樹 右子樹 根,層次序列 根 第二層從左到右 第三層從左到右 以此類推。中序序列又稱為對稱序列。前序序列第乙個節點為根節點,後序序列最後乙個節點為根節點,再在中序序列中找到根節點,中序序列中根節點左邊的為左子樹,右邊的為右子樹...