浙江大學PAT甲級A1020(C )題解

2021-10-02 02:33:36 字數 1536 閱讀 7533

#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...