C++ 中翻轉等效二叉樹
假設我們有一棵二叉樹。我們需要翻轉這棵二叉樹。翻轉表示:選擇任何一個節點,並交換其左右子樹。現在,如果我們可以透過一些翻轉操作從二叉樹 X 得到二叉樹 Y,那麼二叉樹 X 就與二叉樹 Y 翻轉等效。我們需要編寫一個方法來確定兩棵二叉樹是否翻轉等效。樹由根節點 root1 和 root2 給出。因此,如果樹是:
那麼,如果我們翻轉值為 1、3 和 5 的節點,則輸出為 true。
為了解決這個問題,我們將遵循以下步驟:
定義一個遞迴函式 solve(),它將接收兩棵樹 t1 和 t2。
如果 root1 和 root2 為空,則返回 true
否則,如果 root1 為空或 root2 為空,則返回 false
否則,如果(t1 和 t2 都沒有左子樹)或(t1 和 t2 都有左子樹,並且這兩個節點的左子樹的值相同),則
返回 solve(root1 的左子樹, root2 的左子樹) 並且 solve(root1 的右子樹, root2 的右子樹)
否則
返回 solve(root1 的左子樹, root2 的右子樹) 並且 solve(root1 的右子樹, root2 的左子樹)
讓我們來看下面的實現來更好地理解:
示例
#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<TreeNode*> 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; } class Solution { public: bool flipEquiv(TreeNode* root1, TreeNode* root2) { if(!root1 && !root2)return true; else if(!root1 || !root2)return false; else if(root1->val != root2->val) return false; else if((!root1->left && !root2->left) || (root1->left && root2->left && root1->left->val == root2- >left->val)){ return flipEquiv(root1->left, root2->left) && flipEquiv(root1->right, root2->right); }else{ return flipEquiv(root1->left, root2->right) && flipEquiv(root1->right, root2->left); } } }; main(){ vector<int> v = {1,2,3,4,5,6,NULL,NULL,NULL,7,8}; TreeNode *r1 = make_tree(v); vector<int> v1 = {1,3,2,NULL,6,4,5,NULL,NULL,NULL,NULL,NULL,NULL,8,7}; TreeNode *r2 = make_tree(v); Solution ob; cout << (ob.flipEquiv(r1, r2)); }
輸入
[1,2,3,4,5,6,null,null,null,7,8] [1,3,2,null,6,4,5,null,null,null,null,8,7]
輸出
1
廣告