สมมติว่าเรามีต้นไม้ไบนารีสองต้นที่เรียกว่าต้นทางและเป้าหมาย เราต้องตรวจสอบว่ามีการผกผันของต้นทาง T หรือไม่ว่าเป็นแผนผังย่อยของเป้าหมาย ดังนั้นจึงหมายความว่ามีโหนดในเป้าหมายที่เหมือนกันในค่าและโครงสร้างเหมือนกับ T รวมถึงลูกหลานทั้งหมดด้วย
ดังที่เราทราบกันดีว่ามีการกล่าวกันว่าต้นไม้เป็นการผกผันของต้นไม้อื่นหากเป็นเช่นนั้น -
-
ว่างทั้งสองต้น
-
ลูกซ้ายและขวาของมันจะสลับกันได้ และทรีย่อยซ้ายและขวาของมันคือผกผัน
ดังนั้นหากอินพุตเป็นเหมือนแหล่งสัญญาณ

เป้าหมาย

แล้วผลลัพธ์จะเป็น True
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน check() ซึ่งจะใช้ node1, node2,
-
ถ้าทั้ง node1 และ node2 เป็นโมฆะ −
-
คืนความจริง
-
-
ถ้า node1 หรือ node2 อันใดอันหนึ่งเป็นโมฆะ −
-
คืนค่าเท็จ
-
-
ถ้า val ของ node1 ไม่เท่ากับ val ของ node2 แล้ว −
-
คืนค่าเท็จ
-
-
op1 :=ตรวจสอบ (ด้านซ้ายของ node1 ด้านซ้ายของ node2) และตรวจสอบ (ด้านขวาของ node1 ด้านขวาของ node2)
-
op2 :=ตรวจสอบ (ด้านขวาของโหนด 1 ด้านซ้ายของโหนด2) และตรวจสอบ (ด้านซ้ายของโหนด 1 ด้านขวาของโหนด2)
-
คืนค่า จริง เมื่อ op1 และ op2 อย่างน้อยหนึ่งรายการเป็นจริง
-
กำหนดฟังก์ชัน Solve() ซึ่งจะใช้ซอร์ส เป้าหมาย
-
หากต้นทางและเป้าหมายว่างเปล่า −
-
คืนความจริง
-
-
ถ้าต้นทางหรือเป้าหมายอันใดอันหนึ่งเป็นโมฆะ -
-
คืนค่าเท็จ
-
-
op1 :=ตรวจสอบ (เป้าหมาย, แหล่งที่มา)
-
ถ้า op1 เป็นจริง −
-
คืนความจริง
-
-
คืนค่า จริง เมื่อการแก้ (ต้นทาง, ด้านซ้ายของเป้าหมาย) อย่างน้อยหนึ่งรายการ หรือ การแก้ (ต้นทาง, ทางขวาของเป้าหมาย) เป็นจริง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class TreeNode {
public:
int val;
TreeNode *left, *right;
TreeNode(int data) {
val = data;
left = NULL;
right = NULL;
}
};
class Solution {
public:
bool check(TreeNode* node1, TreeNode* node2){
if(!node1 && !node2)
return true;
if(!node1 || !node2)
return false;
if(node1->val != node2->val) {
return false;
}
bool op1 = check(node1->left, node2->left) && check(node1->right, node2->right);
bool op2 = check(node1->right, node2->left) && check(node1->left, node2->right);
return op1 || op2;
}
bool solve(TreeNode* source, TreeNode* target) {
if(!target && !source)
return true;
if(!target || !source)
return false;
bool op1 = check(target, source);
if(op1)
return true;
return solve(source, target->left) || solve(source, target->right);
}
};
main(){
Solution ob;
TreeNode *target = new TreeNode(6);
target->left = new TreeNode(3);
target->right = new TreeNode(1);
target->right->left = new TreeNode(3);
target->right->right = new TreeNode(2);
target->right->right->left = new TreeNode(4);
TreeNode *source = new TreeNode(1);
source->left = new TreeNode(2);
source->right = new TreeNode(3);
source->left->right = new TreeNode(4);
cout << (ob.solve(source, target));
} อินพุต
TreeNode *target = new TreeNode(6); target->left = new TreeNode(3); target->right = new TreeNode(1); target->right->left = new TreeNode(3); target->right->right = new TreeNode(2); target->right->right->left = new TreeNode(4); TreeNode *source = new TreeNode(1); source->left = new TreeNode(2); source->right = new TreeNode(3); source->left->right = new TreeNode(4);
ผลลัพธ์
1