(資料圖片僅供參考)
題目鏈接:https://pintia.cn/problem-sets/994805342720868352/exam/problems/1478635126488367104
唉
,今天的bug出在了下面這條語句。
if (tree[root_key].left * tree[root_key].right < 0) full_tree = false;
我寫成了
full_tree = !(tree[root_key].left * tree[root_key].right < 0); // 這就會導致full_tree即便變成了false也有可能變回true。導致錯判 。根據(jù)前序和中序構建二叉樹
參考的柳神代碼,靈活的點就在于
,用下標表示數(shù)組區(qū)間 ,嗯,相比直接傳數(shù)組的引用,輕了不少。int build(int R, int start, int end, int fa) { // 1. post數(shù)組的最右邊的位置;2. start, end : in數(shù)組的起始位置;3. 對于這題來說還需要記錄父節(jié)點fa。 if (start > end) return -1; int root_key = post[R], pos = start; while (in[pos] != root_key && pos < end) pos++; tree[root_key].level = tree[fa].level + 1; tree[root_key].fa = fa; tree[root_key].left = build(R - 1 - (end - pos), start, pos - 1, root_key); // 記住post的最后一個元素的下標一定要用 R 來相對計算,而不是只用 pos,不然在遞歸的過程中,即便前幾層看不出什么,往后一定會發(fā)生錯位。 tree[root_key].right = build(R - 1, pos + 1, end, root_key); // 下標的選擇是經常容易出bug的,一定要想清楚 if (tree[root_key].left * tree[root_key].right < 0) full_tree = false; return root_key;}題解代碼:
#include#include#include#includeusing namespace std;int n, m;struct Node { Node() { fa = left = right = -1; } int level, fa, left, right;} tree[1005];bool full_tree = true;int in[35], post[35], num1, num2;int build(int R, int start, int end, int fa) { // 1. post數(shù)組的最右邊的位置;2. start, end : in數(shù)組的起始位置;3. 對于這題來說還需要記錄父節(jié)點fa。 if (start > end) return -1; int root_key = post[R], pos = start; while (in[pos] != root_key && pos < end) pos++; tree[root_key].level = tree[fa].level + 1; tree[root_key].fa = fa; tree[root_key].left = build(R - 1 - (end - pos), start, pos - 1, root_key); // 記住post的最后一個元素的下標一定要用 R 來相對計算,而不是只用 pos,不然在遞歸的過程中,即便前幾層看不出什么,往后一定會發(fā)生錯位。 tree[root_key].right = build(R - 1, pos + 1, end, root_key); // 下標的選擇是經常容易出bug的,一定要想清楚 if (tree[root_key].left * tree[root_key].right < 0) full_tree = false; return root_key;}bool siblings(int a, int b) { return tree[a].fa == tree[b].fa;}bool same_level(int a, int b) { return tree[a].level == tree[b].level;}bool parent(int a, int b) { return tree[b].fa == a;}bool left_child(int a, int b) { return tree[b].left == a;}bool right_child(int a, int b) { return tree[b].right == a;}int main() { cin >> n; for (int i = 0; i < n; i++) cin >> post[i]; for (int i = 0; i < n; i++) cin >> in[i]; int root = post[n - 1]; build(n - 1, 0, n - 1, 0); cin >> m; while (m--) { string str; cin >> str; if (str[0] == "I") { getline(cin, str); cout << (full_tree ? "Yes" : "No") << endl; } else { num1 = stoi(str); cin >> str; if (str[0] == "a") { cin >> num2 >> str >> str; if (str[0] == "s") { cout << (siblings(num1, num2) ? "Yes" : "No") << endl; } else { getline(cin, str); cout << (same_level(num1, num2) ? "Yes" : "No") << endl; } } else { cin >> str >> str; switch(str[1]) { case "o" : { cout << (root == num1 ? "Yes" : "No") << endl; } break; case "a" : { cin >> str >> num2; cout << (parent(num1, num2) ? "Yes" : "No") << endl; } break; case "e" : { cin >> str >> str >> num2; cout << (left_child(num1, num2) ? "Yes" : "No") << endl; } break; case "i" : { cin >> str >> str >> num2; cout << (right_child(num1, num2) ? "Yes" : "No") << endl; } break; } } } } return 0;}剛做的時候以為要用層序遍歷,順便復習一下吧
。層序遍歷模板代碼:
vector> level_order(Node *root) { vector> res; queue q; if (root) q.push(root); while (q.size()) { int size = q.size(); vector v; for (int i = 0; i < size; i++) { Node *node = q.front(); q.pop(); // 上一排的元素依次出隊 v.push_back(node->val); // 下一排的節(jié)點全部入隊 if (node->left) q.push(node->left); if (node->right) q.push(node->right); } // 存入一排 res.push_back(v); } return res;}
關鍵詞:
最近更新
- 當前快看:1159 Structure of a Binary Tree + 根據(jù)前序和中序構建二叉樹+ 層序遍歷模板復習2023-05-03
- 今日訊!外機對我軍航母抵近偵察,飛鯊勇士戰(zhàn)斗周旋2023-05-03
- 環(huán)球觀熱點:五一假期最熱十大景區(qū)出爐:杭州西湖居榜首2023-05-03
- AI算力需求打開增量空間!通信類電子陶瓷外殼乃光模塊必備零組件 受益上市公司梳理2023-05-03
- 4月深圳二手商品住宅成交30.22萬平方米 同比增長1.93%2023-05-03
- 每日速讀!友車科技:科創(chuàng)板IPO網(wǎng)上中簽號碼共有2.75萬個2023-05-03
- [一季報]力源科技(688565):力源科技:關于 2023 年第一季度報告的更正公告2023-05-03
- 全球要聞:普元信息(688118):普元信息技術股份有限公司關于2022年年度股東大會取消部分議案并增加臨時提案2023-05-03
- 普元信息(688118):普元信息技術股份有限公司關于變更公司注冊地址、修訂《公司章程》(更新)并辦理工商變更登記2023-05-03
- 熱資訊!小長假即將結束,節(jié)后綜合征來了怎么辦?這樣應對2023-05-03
- 媒體:北溪管道爆炸前幾天 一艘俄羅斯軍艦在該管道附近被發(fā)現(xiàn)|世界時快訊2023-05-03
- 世界熱消息:日職聯(lián)戰(zhàn)報:藤井陽也補時絕平,名古屋2-2神戶勝利船2023-05-03
- 磁帶怪獸狂風限定盤成就怎么解鎖 今日看點2023-05-03
- 韓國“陣營外交”損人不利己2023-05-03
- 手機qq怎么設置密保問題_用手機qq密保怎么設置2023-05-03
- 【環(huán)球速看料】中國主導全球IPO市場?2023-05-03
- 諾誠健華(688428):諾誠健華醫(yī)藥有限公司關于召開2023年股東周年大會的通知2023-05-03
- 中國育兒成本全球第二高 !養(yǎng)育一個孩子到底有多貴?2023-05-03
- [年報]容百科技(688005):公司自愿披露2022年年度報告簡版及ESG報告英文版本 熱門2023-05-03
- 節(jié)后兩日解禁超1100億元 ,昔日疫苗“牛股”獨占近700億 ,5家解禁占比超4成2023-05-03
- 每日速遞:“五一”假期省內游客占比超76%2023-05-03
- 熱點!張本智和發(fā)聲:德班世乒賽目標是金牌 ,有信心擊敗樊振東等主力2023-05-03
- 國民待遇條款一般適用于外國公民或企業(yè)的經濟權利_國民待遇2023-05-03
- 每日熱訊!高考514分左右能上什么大學 新高考可以報考的公辦院校2023-05-03
- [異常波動]金石亞藥(300434):股票交易異常波動公告2023-05-03
- 富瀚微(300613):富瀚轉債暫停轉股的提示性公告2023-05-03
- 6成收入正增長 、8成盈利,深市公司去年凈利潤9279億 熱門看點2023-05-03
- 富瀚微(300613):籌劃發(fā)行股份及支付現(xiàn)金購買資產并募集配套資金暨關聯(lián)交易事項的停牌公告 天天時快訊2023-05-03
- 中科創(chuàng)達(300496):公司2020年股票期權激勵計劃第三個行權期采用自主行權模式的提示性公告2023-05-03
- 最新消息:6成收入正增長 、8成盈利 ,深市公司去年凈利潤9279億2023-05-03