สมมติว่ามีไบนารีทรี เราจะทำการค้นหาแบบพรีออเดอร์ในเชิงลึกก่อนบนรูทของไบนารีทรี
ที่แต่ละโหนดในการข้ามผ่านนี้ เอาต์พุตจะเป็นจำนวน D ของขีดกลาง (ในที่นี้ D คือความลึกของโหนดนี้) หลังจากนั้นเราแสดงค่าของโหนดนี้ ดังที่เรารู้ว่าความลึกของโหนดเป็น D หรือไม่ ความลึกของโหนดย่อยที่อยู่ติดกันคือ D+1 และความลึกของโหนดรูทคือ 0
อีกอย่างที่เราต้องจำไว้คือถ้าโหนดมีลูกเพียงคนเดียว เด็กคนนั้นรับประกันว่าจะเป็นลูกด้านซ้าย ดังนั้น หากให้เอาท์พุต S ของการข้ามผ่านนี้ ให้กู้คืนต้นไม้และคืนรากของมัน
ดังนั้น หากอินพุตเป็น "1-2--3--4-5--6--7" ผลลัพธ์จะเป็น
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดหนึ่งสแต็ก st
-
ผม :=0, n :=ขนาดของ S
-
เลเวล :=0, num :=0
-
ในขณะที่ฉัน
-
สำหรับการเริ่มต้น lvl :=0 เมื่อ S[i] เหมือนกับ '-' ให้อัปเดต (เพิ่มเลเวลทีละ 1) (เพิ่ม i ขึ้น 1) ทำ -
-
ไม่ทำอะไรเลย
-
-
num :=0
-
ในขณะที่ (i
-
num :=num * 10 + (S[i] - '0')
-
(เพิ่ม i ขึ้น 1)
-
-
ในขณะที่ขนาดของ st> lvl ทำ −
-
ลบองค์ประกอบออกจาก st
-
-
temp =สร้าง Tree Node ใหม่โดยมีค่า num
-
ถ้าไม่ใช่ st ว่างเปล่า และไม่เหลือองค์ประกอบบนสุดของ st จะเป็นโมฆะ −
-
ด้านซ้ายขององค์ประกอบด้านบนของ st :=temp
-
-
มิฉะนั้นเมื่อ st ไม่ว่างเปล่า ดังนั้น −
-
ด้านขวาขององค์ประกอบด้านบนของ st :=temp
-
-
ใส่อุณหภูมิลงใน st
-
-
ในขณะที่ขนาดของ st> 1 ทำ −
-
ลบองค์ประกอบออกจาก st
-
-
return (ถ้า st ว่างเปล่า แสดงว่าเป็น NULL มิฉะนั้น องค์ประกอบบนสุดของ st)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = NULL; right = NULL; } }; void inord(TreeNode *root){ if(root != NULL){ inord(root->left); cout << root->val << " "; inord(root->right); } } class Solution { public: TreeNode* recoverFromPreorder(string S) { stack<TreeNode*> st; int i = 0; int n = S.size(); int lvl = 0; int num = 0; while (i < n) { for (lvl = 0; S[i] == '-'; lvl++, i++) ; num = 0; while (i < n && S[i] != '-') { num = num * 10 + (S[i] - '0'); i++; } while (st.size() > lvl) st.pop(); TreeNode* temp = new TreeNode(num); if (!st.empty() && !st.top()->left) { st.top()->left = temp; } else if (!st.empty()) { st.top()->right = temp; } st.push(temp); } while (st.size() > 1) st.pop(); return st.empty() ? NULL : st.top(); } }; main(){ Solution ob; TreeNode *root = ob.recoverFromPreorder("1-2--3--4-5--6--7"); inord(root); }
อินพุต
"1-2--3--4-5--6--7"
ผลลัพธ์
3 2 4 1 6 5 7