啊啊啊啊,今天有事沒能去聽老趙的講座好遺憾。上一次是范瑋琪張敬軒的演唱會,開在家門口的演唱會都沒去。這次是ssp計畫發起者的講座,同樣是開在家門口的,我都與之插肩而過。
今天看了《acm-icpc程式設計系列:圖論及應用》第二章關於樹的部分。主要是關於一些樹的定義和一些演算法。
書上的例題只給了思路沒有**。我在網上找到了原題。
view code
/*【題目**】
【題目分析】
給定樹的前序遍歷和中序遍歷,要求輸出後序遍歷。
【思路分析】
1.前序遍歷中:第乙個元素就是根。
2.中序遍歷中:
找到根的位置。
根的左邊是根的左子樹的中序遍歷,右邊是根的右子樹的中序遍歷。
得到左子樹元素個數l。
3.前序遍歷中:
除去根,前l個元素是左子樹的前序遍歷。剩下的是右子樹的前序遍歷。
4.這樣就得到了左子樹和右子樹的前序遍歷和中序遍歷。對左子樹和右子樹遞迴下去,一定會出現樹空的情況或只剩下乙個元素的情況。
當樹空的時候返回,當元素只有乙個的時候,輸出來並返回。 對左子樹和右子樹遞迴下去完成後就輸出根節點。這樣就得到了完整的後序遍歷。
【附加細節】
substr(index, n) 從index開始(包括index)連續n個
【小小感受】
這道題思路清晰的時候寫的,一次就ac了,感覺很好。以前很多情況總是思路沒那麼清晰就開始敲**,結果就是要修改好多次才能ac。
所以呢。。思考還是比較重要的。
*/#include
#include
using
namespace
std;
void solve(string pre, stringin)
int index = in.find(pre[0
]);
string left_pre = pre.substr(1
, index);
string right_pre = pre.substr(index+1, pre.size()-1-index);
string left_in = in.substr(0
, index);
string right_in = in.substr(index+1, in.size()-1-index);
solve(left_pre, left_in);
//左
solve(right_pre, right_in);
//右
cout
<< pre[0];//
根 return;}
intmain()
}
前序遍歷 中序遍歷 後序遍歷
只要是搞計算機的,對資料結構中二叉樹遍歷都不陌生,但是如果用到的機會不多那麼就會慢慢淡忘,溫故而之新才是最好的學習方式,現在就重新溫習一下這方面的知識。首先我想先改變這幾個遍歷的名字 前根序遍歷,中根序遍歷,後根序遍歷 前中後本來就是相對於根結點來說的,少乙個字會產生很多不必要的誤解。1.前根序遍歷...
前序遍歷 中序遍歷 後序遍歷
遍歷是針對根節點的 前序遍歷順序 根節點 左子樹 右子樹 中序遍歷順序 左子樹 根節點 右子樹 後序遍歷順序 左子樹 右子樹 根節點 深入一點去理解這個排序順序是這樣的 前序遍歷 首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。中...
前序遍歷 中序遍歷 後序遍歷
前序遍歷 dlr 前序遍歷也叫做先根遍歷 先序遍歷,可記做根左右。前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。若二叉樹 為空則結束返回,否則 1 訪問根結點。2 前序遍歷左子樹。3 前序遍歷右子樹 需要注意的是 遍歷左右...