#include
#include
#include
using namespace std;
const
int content =50;
struct node
;int post[content]
;int in[content]
;node*
create
(int postl,
int postr,
int inl,
int inr)
node* root =
newnode
; root-
>data = post[postr]
;int k;
for(
int i =inl;i<=inr;i++)}
//此時k是分水嶺
int numleft = k -inl;
root-
>lchild =
create
(postl,postl+numleft-
1,inl,k-1)
;// root->lchild = create(postl,postl+numleft-1,inl,k-1);
root-
>rchild =
create
(postl+numleft,postr-
1,k+
1,inr)
;return root;
}int sum =0;
int n;
void
bfs(node* root)
if(node-
>lchild!=null)
if(node-
>rchild!=null)}}
intmain()
for(
int i =
0;i) node* root =
create(0
,n-1,0
,n-1);
bfs(root)
;return0;
}
//難點 通過後序 中序建立樹
其中難點有2:
1.root->lchild = create(postl,postl+numleft-1,inl,k-1);
root->rchild = create(postl+numleft,postr-1,k+1,inr);
遞迴遍歷左子樹的後序 區間是 postl postl+numleft-1 直觀理解沒問題 就是左邊界+左子樹結點+1就是又邊界,但是這時候我們一定有疑問,為何都求出k了,為什麼不讓postl+k-1作為右邊界呢?如果換成
root->lchild = create(postl,postl+k-1,inl,k-1);程式是會崩潰的。why?
首先 第一次程式執行 確實numleft=k-inl =k但是後面呢?每次遞迴時候inl的邊界可不一定都是0,所以邊界是不能用k來衡量 要用k-inl來衡量。
2.bfs遍歷 老生常談了 佇列就完事了。注意格式即可。
浙江大學PAT甲級A1138 C )題解
如果有哪位同學幸運的看到這篇題解 恭喜你,你賺大了!你會看到乙個簡單理解而且實用的技巧。乍一看,不就是前序中序建樹嘛。有什麼奇怪的。如果此題常規建樹,後序遍歷後兩個測試用例超時!那麼怎麼進行優化呢?顯然 在尋找根結點時候,不用for迴圈 題中注釋 而改用map!map在輸入的時候已經記錄了根節點的位...
浙江大學PAT甲級A1074題解 C 2
include include include using namespace std struct node int main while first 1 first next first for int i k i real.size i i k cout int i 0 isize i els...
浙江大學pat 1001
注意點 1.對於輸出結果是負數先輸出負號 2.將結果轉化成char型別來進行輸出可以避免輸出 的複雜操作。這裡使用函式sprintf 實現。如下 include include include include include include define maxnum 0x3f3f3f3f defi...