สมมติว่าเรามีไบนารีทรีที่โหนดที่ถูกต้องทั้งหมดเป็นโหนดปลายสุดที่มีพี่น้องว่าง เราต้องพลิกมันกลับหัวและเปลี่ยนเป็นต้นไม้โดยที่โหนดด้านขวาเดิมกลายเป็นโหนดปลายสุดด้านซ้าย เราต้องคืนโหนดใหม่
ดังนั้นหากอินพุตเป็นเช่น [1,2,3,4,5]
จากนั้นผลลัพธ์จะส่งคืนรูทของไบนารีทรี [4,5,2,#,#,3,1]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน Solve() ซึ่งจะใช้ node, par, brother,
-
หากไม่มีโหนด ดังนั้น −
-
คืนค่า NULL
-
-
ลูก =ด้านซ้ายของโหนด
-
currSib =ด้านขวาของโหนด
-
node :=เหลือพี่น้อง
-
node :=สิทธิของพาร์
-
หากไม่มีลูกและลูกเกด −
-
โหนดกลับ
-
-
ส่งคืนการแก้ (ลูก, โหนด, currSib)
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
ส่งคืนการแก้ (root, NULL, NULL)
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#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 insert(TreeNode **root, int val){ queue q; q.push(*root); while(q.size()){ TreeNode *temp = q.front(); q.pop(); if(!temp->left){ if(val != NULL) temp->left = new TreeNode(val); else temp->left = new TreeNode(0); return; } else{ q.push(temp->left); } if(!temp->right){ if(val != NULL) temp->right = new TreeNode(val); else temp->right = new TreeNode(0); return; } else{ q.push(temp->right); } } } TreeNode *make_tree(vector<int< v){ TreeNode *root = new TreeNode(v[0]); for(int i = 1; i<v.size(); i++){ insert(&root, v[i]); } return root; } void inord(TreeNode *root){ if(root != NULL){ inord(root->left); cout << root->val << " "; inord(root->right); } } class Solution { public: TreeNode* solve(TreeNode* node, TreeNode* par, TreeNode* sibling){ if (!node || node->val == 0) return NULL; TreeNode* child = node->left; TreeNode* currSib = node->right; node->left = sibling; node->right = par; if (!child && !currSib) return node; return solve(child, node, currSib); } TreeNode* upsideDownBinaryTree(TreeNode* root) { return solve(root, NULL, NULL); } }; main(){ Solution ob; vector<int< v = {1,2,3,4,5}; TreeNode *root = make_tree(v); inord(ob.upsideDownBinaryTree(root)); }
อินพุต
[1,2,3,4,5]
ผลลัพธ์
[4,5,2,null,null,3,1]