HDU 1710 樹的遍歷

2021-07-05 01:18:48 字數 1109 閱讀 3861

由前序和中序結果求後序遍歷結果

樹的遍歷

給你一棵樹的先序遍歷結果和中序遍歷的結果,讓你求以後序遍歷輸出用遞迴。每次把兩個陣列分成三個部分,父節點,左子樹,右子樹,把父節點放到陣列裡邊,重複此步驟直到重建一棵新樹,  這時,陣列裡元素剛好是後序遍歷的順序

關鍵點:

中序遍歷的特點是先遍歷左子樹,接著根節點,然後遍歷右子樹。這樣根節點就把左右子樹隔開了。

而前序遍歷的特點是先訪問根節點,從而實現前序遍歷結果提供根節點資訊,中序遍歷提供左右子樹資訊,從而實現二叉樹的重建。

**:

#include#include#define n 1005

using namespace std;

stacks; //存放父節點

int pre[n],in[n],a[n]; //先序陣列和後序陣列

void make(int preleft,int preright,int inleft,int inright)

int main()

return 0;

}

注: 已知二叉樹的前序和中序遍歷, 可以唯一確定二叉樹的後序遍歷, 但如果知道前序和後序,求中序遍歷是不可能實現的.

演算法: 由前序遍歷的第乙個元素可確定左、右子樹的根節點,參照中序遍歷又可進一步確定子樹的左、右子樹元素。如此遞迴地參照兩個遍歷序列,最終構造出二叉樹。

**如下:

char preorder[100]; char inorder[100];

void buildtree(int preleft,int preright, int inleft, int inright)

//獲得左樹和右樹的大小

leftsize = parent - inleft; rightsize = inright - parent;

//如果有左子樹,遞迴重建左子樹

if (leftsize > 0)

//如果有右子樹,遞迴重建右子樹

if (rightsize > 0 )

//若無子樹,列印父節點

printf("%c " , inorder[parent]);

}}

hdu 1710 二叉樹遍歷

二叉樹的遍歷 先序遍歷 preorder tr ersal 先遍歷父節點,然後是左孩子,右孩子。中序遍歷 inorder tr ersal 先遍歷左孩子,然後是父節點,最後遍歷右孩子。後序遍歷 postorder tr ersal 先遍歷左孩子和右孩子,然後遍歷父節點。題目大意 給出乙個二叉樹的先序...

hdu1710 二叉樹詳解

題意 給出前序遍歷序列和中序遍歷序列,求後序遍歷序列 首先要根據前序和中序把樹建立起來,再寫後序遍歷就好 思路很簡單結果還是被我寫跪了,看了好些博文,感覺,好吧不算是什麼小技巧,是我編碼太渣太渣。有兩個地方借鑑了,於是我居然很有興致的把自己的也詳細詳細的全註解上了,要是平時也有耐心這樣多好。就不會過...

hdu 1710恢復二叉樹

恢復二叉樹是面試的經典題目,首先我們知道的結論是已知前序和中序或者後序和中序,那麼我們就可以唯一的確定乙個二叉樹。思路是在 中序的某一段中 前序 後序 中靠前 後 的 節點是這一段中序的父親節點,並且由這個節點將這一段劃分為二。當不能劃分的時候就是到了葉子節點。所以我們可以考慮傳遞父親節點和他的部分...